From 7ca6fcd79a62a44b1942350e9e6bd402c0d0a583 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Tue, 12 Sep 2023 00:47:17 -0600 Subject: [PATCH 01/34] Updated README 1. Updated README like @JGreenlee mentioned to successfully build 2. Maintaining current version 3. Will update again after updating JDK in this intel machine --- README.md | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 0c02868db..06d860d0c 100644 --- a/README.md +++ b/README.md @@ -141,6 +141,11 @@ Installing (one time only) --- Run the setup script for the platform you want to build +Make sure you switch to the "label_dashboard_profile_sept_2023" branch +``` +git checkout label_dashboard_profile_sept_2023 +``` + ``` $ bash setup/setup_android_native.sh AND/OR @@ -156,14 +161,6 @@ $ cp www/json/startupConfig.json.sample www/json/startupConfig.json $ cp ..... www/json/connectionConfig.json ``` -### Activation (after install, and in every new shell) - -``` -$ source setup/activate_native.sh -``` - -### Activation (after install, and in every new shell) - If connecting to a development server over http, make sure to turn on http support on android ``` @@ -174,10 +171,15 @@ If connecting to a development server over http, make sure to turn on http suppo ### Run in the emulator +Pick a version and execute the following: + ``` -$ npx cordova emulate ios -AND/OR -$ npx cordova emulate android +$ npm run +``` + +For instance: (build-dev-android) +``` +$ npm run build-dev-android ``` Creating logos From 6822c67466d48e5cc3059aa6003b7930e25e9095 Mon Sep 17 00:00:00 2001 From: niccolopaganini Date: Sat, 23 Sep 2023 13:13:44 -0600 Subject: [PATCH 02/34] multiple changes: 1. structure/ flow 2. added contents section 3. updated certain resources --- README.md | 301 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 185 insertions(+), 116 deletions(-) diff --git a/README.md b/README.md index 06d860d0c..a14f99a01 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,60 @@ -e-mission phone app --------------------- +# e-mission phone app -This is the phone component of the e-mission system. +__This is the phone component of the e-mission system.__ -:sparkles: This has now been upgraded to cordova android@9.0.0 and iOS@6.0.1 ([details](https://github.com/e-mission/e-mission-docs/issues/554)). It has also been upgraded to [android API 29](https://github.com/e-mission/e-mission-phone/pull/707/), [cordova-lib@10.0.0 and the most recent node and npm versions](https://github.com/e-mission/e-mission-phone/pull/708)It also now supports CI, so we should not have any build issues in the future. The limitations from the [previous upgrade](https://github.com/e-mission/e-mission-docs/issues/519) have all been resolved. This should be ready to build out of the box, after all the configuration files are changed. +:sparkles: This has now been upgraded to cordova android@12.0.0 and iOS@6.2.0. It has also been upgraded to [android API 33 and the latest iOS versions](https://github.com/e-mission/e-mission-docs/issues/934), [cordova-lib@10.0.0 and the most recent node and npm versions](). It also now supports CI, so we should not have any build issues in the future. __This should be ready to build out of the box.__ -Additional Documentation ---- +## Additional Documentation Additional documentation has been moved to its own repository [e-mission-docs](https://github.com/e-mission/e-mission-docs). Specific e-mission-phone wikis can be found here: https://github.com/e-mission/e-mission-docs/tree/master/docs/e-mission-phone **Issues:** Since this repository is part of a larger project, all issues are tracked [in the central docs repository](https://github.com/e-mission/e-mission-docs/issues). If you have a question, [as suggested by the open source guide](https://opensource.guide/how-to-contribute/#communicating-effectively), please file an issue instead of sending an email. Since issues are public, other contributors can try to answer the question and benefit from the answer. -Updating the UI only +:sparkles: Check 6. Contributing if you're interested in contributing for this project :sparkles: + +## Contents +#### 1. [Creating logos](#1.-Creating-logos) -> Information regarding app Logo +#### 2. [Updating the UI only](#2.-Updating-the-UI-only) -> For UI changes ONLY +#### 3. [Updating the e-mission-* plugins or adding new plugins](#3.-Updating-the-e-mission-\*-plugins-or-adding-new-plugins) -> Work with native code +#### 4. [End to End Testing](#4.-End-to-End-Testing) +#### 5. [Beta-testing debugging](#5.-Beta-testing-debugging) +#### 6. [Contributing](#6.-Contributing) --- + +## 1. Creating logos + +If you are building your own version of the app, you must have your own logo to +avoid app store conficts. Updating the logo is very simple using the [`ionic +cordova resources`](https://ionicframework.com/docs/v3/cli/cordova/resources/) +command. + +**Note**: You may have to install the [`cordova-res` package](https://github.com/ionic-team/cordova-res) for the command to work + +## 2. Updating the UI only [![osx-serve-install](https://github.com/e-mission/e-mission-phone/workflows/osx-serve-install/badge.svg)](https://github.com/e-mission/e-mission-phone/actions?query=workflow%3Aosx-serve-install) If you want to make only UI changes, (as opposed to modifying the existing plugins, adding new plugins, etc), you can use the **new and improved** (as of June 2018) [e-mission dev app](https://github.com/e-mission/e-mission-devapp/) and install the most recent version from [releases](https://github.com/e-mission/e-mission-devapp/releases). ### Installing (one-time) -Run the setup script +1. Run the setup script ``` -$ bash setup/setup_serve.sh +bash setup/setup_serve.sh ``` - **(optional)** Configure by changing the files in `www/json`. Defaults are in `www/json/*.sample` ``` -$ ls www/json/*.sample -$ cp www/json/startupConfig.json.sample www/json/startupConfig.json -$ cp ..... www/json/connectionConfig.json +ls www/json/*.sample +cp www/json/startupConfig.json.sample www/json/startupConfig.json +cp ..... www/json/connectionConfig.json ``` ### Activation (after install, and in every new shell) - +2. Run this to activate ``` -$ source setup/activate_serve.sh +source setup/activate_serve.sh ``` ### Running @@ -46,7 +62,7 @@ $ source setup/activate_serve.sh 1. Start the phonegap deployment server and note the URL(s) that the server is listening to. ``` - $ npm run serve + npm run serve .... [phonegap] listening on 10.0.0.14:3000 [phonegap] listening on 192.168.162.1:3000 @@ -56,10 +72,10 @@ $ source setup/activate_serve.sh .... ``` -1. Change the devapp connection URL to one of these (e.g. 192.168.162.1:3000) and press "Connect" -1. The app will now display the version of e-mission app that is in your local directory - 1. The console logs will be displayed back in the server window (prefaced by `[console]`) - 1. Breakpoints can be added by connecting through the browser +2. Change the devapp connection URL to one of these (e.g. 192.168.162.1:3000) and press "Connect" +3. The app will now display the version of e-mission app that is in your local directory + 4. The console logs will be displayed back in the server window (prefaced by `[console]`) + 5. Breakpoints can be added by connecting through the browser - Safari ([enable develop menu](https://support.apple.com/guide/safari/use-the-safari-develop-menu-sfri20948/mac)): Develop -> Simulator -> index.html - Chrome: chrome://inspect -> Remote target (emulator) @@ -67,37 +83,68 @@ $ source setup/activate_serve.sh **Note1**: You may need to scroll up, past all the warnings about `Content Security Policy has been added` to find the port that the server is listening to. -End to end testing ---- -A lot of the visualizations that we display in the phone client come from the server. In order to do end to end testing, we need to run a local server and connect to it. Instructions for: +## 3. Updating the e-mission-\* plugins or adding new plugins -1. installing a local server, -2. running it, -3. loading it with test data, and -4. running analysis on it +[![osx-build-ios](https://github.com/e-mission/e-mission-phone/actions/workflows/ios-build.yml/badge.svg)](https://github.com/e-mission/e-mission-phone/actions/workflows/ios-build.yml) +[![osx-build-android](https://github.com/e-mission/e-mission-phone/actions/workflows/android-build.yml/badge.svg)](https://github.com/e-mission/e-mission-phone/actions/workflows/android-build.yml) -are available in the [e-mission-server README](https://github.com/e-mission/e-mission-server/blob/master/README.md). +__Important__ -In order to make end to end testing easy, if the local server is started on a HTTP (versus HTTPS port), it is in development mode. By default, the phone app connects to the local server (localhost on iOS, [10.0.2.2 on android](https://stackoverflow.com/questions/5806220/how-to-connect-to-my-http-localhost-web-server-from-android-emulator-in-eclips)) with the `prompted-auth` authentication method. To connect to a different server, or to use a different authentication method, you need to create a `www/json/connectionConfig.json` file. More details on configuring authentication [can be found in the docs](https://github.com/e-mission/e-mission-docs/blob/master/docs/install/configuring_authentication.md). +Most of the recent issues encountered have been due to incompatible setup. We +have now: +- locked down the dependencies, +- created setup and teardown scripts to setup self-contained environments with + those dependencies, and +- CI enabled to validate that they continue work. -One advantage of using `skip` authentication in development mode is that any user email can be entered without a password. Developers can use one of the emails that they loaded test data for in step (3) above. So if the test data loaded was with `-u shankari@eecs.berkeley.edu`, then the login email for the phone app would also be `shankari@eecs.berkeley.edu`. +If you have setup failures, please compare the configuration in the **passing CI +builds** with your configuration. That is almost certainly the source of the error. -Updating the e-mission-\* plugins or adding new plugins ---- -[![osx-build-ios](https://github.com/e-mission/e-mission-phone/actions/workflows/ios-build.yml/badge.svg)](https://github.com/e-mission/e-mission-phone/actions/workflows/ios-build.yml) -[![osx-build-android](https://github.com/e-mission/e-mission-phone/actions/workflows/android-build.yml/badge.svg)](https://github.com/e-mission/e-mission-phone/actions/workflows/android-build.yml) +### Tested on +__MacOS__ +- Intel chip, MacOS Ventura 13.6 +- Intel chip, MacOS Ventura 13.5.2 +- Intel chip, MacOS Ventura 13.0 +- Intel chip, MacOS Monterey 12.6.7 Pre-requisites --- -- the version of xcode used by the CI +- The version of xcode used by the CI. - to install a particular version, use [xcode-select](https://www.unix.com/man-page/OSX/1/xcode-select/) - or this [supposedly easier to use repo](https://github.com/xcpretty/xcode-install) - **NOTE**: the basic xcode install on Catalina was messed up for me due to a prior installation of command line tools. [These workarounds helped](https://github.com/nodejs/node-gyp/blob/master/macOS_Catalina.md). - git -- Java 11. Tested with [OpenJDK 11 (Temurin) using AdoptOpenJDK](https://adoptopenjdk.net/releases.html). -- android SDK; install manually or use setup script below. Note that you only need to run this once **per computer**. +- Java 17. Tested with [OpenJDK 17 (Temurin) using AdoptOpenJDK](https://adoptium.net). +- if you are not on the most recent version of OSX: `homebrew` + - this allows us to install the current version of cocoapods without + running into ruby incompatibilities - e.g. + https://github.com/CocoaPods/CocoaPods/issues/11763 + +__1. Export statements__ +``` +export ANDROID_SDK_ROOT="/Users//Library/Android/sdk" +``` +``` +export ANDROID_HOME="/Users//Library/Android/sdk" +``` +aka the path where you want the SDK to be installed. + +To setup JAVA_HOME (after installing the latest JDK ), run this command: +``` +/usr/libexec/java_home +``` +Find the location of the Java installation (Default will look something like this:) +``` +/Library/Java/JavaVirtualMachines/... +``` +and then export the package as: +``` +export JAVA_HOME="" +``` + +- android SDK; install manually or use setup script below (**recommended**). Note that you only need to run this once **per computer**. ``` - $ bash setup/prereq_android_sdk_install.sh + bash setup/prereq_android_sdk_install.sh ```
Expected output @@ -120,45 +167,25 @@ Pre-requisites ```
-- if you are not on the most recent version of OSX, `homebrew` - - this allows us to install the current version of cocoapods without - running into ruby incompatibilities - e.g. - https://github.com/CocoaPods/CocoaPods/issues/11763 - -Important ---- -Most of the recent issues encountered have been due to incompatible setup. We -have now: -- locked down the dependencies, -- created setup and teardown scripts to setup self-contained environments with - those dependencies, and -- CI enabled to validate that they continue work. -If you have setup failures, please compare the configuration in the passing CI -builds with your configuration. That is almost certainly the source of the error. -Installing (one time only) ---- -Run the setup script for the platform you want to build +__2. Installing (one time only)__ -Make sure you switch to the "label_dashboard_profile_sept_2023" branch -``` -git checkout label_dashboard_profile_sept_2023 -``` +- Run the setup script for the platform you want to build ``` -$ bash setup/setup_android_native.sh +bash setup/setup_android_native.sh AND/OR -$ bash setup/setup_ios_native.sh +bash setup/setup_ios_native.sh ``` **(optional)** Configure by changing the files in `www/json`. Defaults are in `www/json/*.sample` ``` -$ ls www/json/*.sample -$ cp www/json/startupConfig.json.sample www/json/startupConfig.json -$ cp ..... www/json/connectionConfig.json +ls www/json/*.sample +cp www/json/startupConfig.json.sample www/json/startupConfig.json +cp ..... www/json/connectionConfig.json ``` If connecting to a development server over http, make sure to turn on http support on android @@ -168,44 +195,58 @@ If connecting to a development server over http, make sure to turn on http suppo ``` +__3. Run this in every new shell__ + +- __Activation__ +``` +source setup/activate_native.sh +``` +
Expected Output + +``` +Activating nvm +Using version 19.5.0 +Now using node v19.5.0 (npm v9.3.1) +npm version = 9.3.1 +Adding cocoapods to the path +Verifying /Users//Library/Android/sk or /Users//Library/Android/sdk is set +Activating sdkman, and by default, gradle +Ensuring that we use the most recent version of the command line tools +Configuring the repo for building native code +Copied config.cordovabuild.xml -> config.xml and package.cordovabuild.json -> package.json +``` -### Run in the emulator +
-Pick a version and execute the following: +- __Pick a type of build and execute the following:__ +More "versions" are available in [`package.cordovabuild.json`](https://github.com/e-mission/e-mission-phone/blob/fce117ff859abd995613bd405dbc7d27c703b09b/package.cordovabuild.json) ``` -$ npm run +npm run ``` For instance: (build-dev-android) ``` -$ npm run build-dev-android +npm run build-dev-android ``` -Creating logos ---- -If you are building your own version of the app, you must have your own logo to -avoid app store conficts. Updating the logo is very simple using the [`ionic -cordova resources`](https://ionicframework.com/docs/v3/cli/cordova/resources/) -command. -**Note**: You may have to install the [`cordova-res` package](https://github.com/ionic-team/cordova-res) for the command to work +## 4. End to End Testing +A lot of the visualizations that we display in the phone client come from the server. In order to do end to end testing, we need to run a local server and connect to it. Instructions for: -Troubleshooting ---- -- Make sure to use `npx ionic` and `npx cordova`. This is - because the setup script installs all the modules locally in a self-contained - environment using `npm install` and not `npm install -g` -- Check the CI to see whether there is a known issue -- Run the commands from the script one by one and see which fails - - compare the failed command with the CI logs -- Another workaround is to delete the local environment and recreate it - - javascript errors: `rm -rf node_modules && npm install` - - native code compile errors: `rm -rf plugins && rm -rf platforms && npx cordova prepare` +1. installing a local server, +2. running it, +3. loading it with test data, and +4. running analysis on it -Beta-testing debugging ---- +are available in the [e-mission-server README](https://github.com/e-mission/e-mission-server/blob/master/README.md). + +In order to make end to end testing easy, if the local server is started on a HTTP (versus HTTPS port), it is in development mode. By default, the phone app connects to the local server (localhost on iOS, [10.0.2.2 on android](https://stackoverflow.com/questions/5806220/how-to-connect-to-my-http-localhost-web-server-from-android-emulator-in-eclips)) with the `prompted-auth` authentication method. To connect to a different server, or to use a different authentication method, you need to create a `www/json/connectionConfig.json` file. More details on configuring authentication [can be found in the docs](https://github.com/e-mission/e-mission-docs/blob/master/docs/install/configuring_authentication.md). + +One advantage of using `skip` authentication in development mode is that any user email can be entered without a password. Developers can use one of the emails that they loaded test data for in step (3) above. So if the test data loaded was with `-u shankari@eecs.berkeley.edu`, then the login email for the phone app would also be `shankari@eecs.berkeley.edu`. + +## 5. Beta-testing debugging If users run into problems, they have the ability to email logs to the maintainer. These logs are in the form of an sqlite3 database, so they have to be opened using `sqlite3`. Alternatively, you can export it to a csv with @@ -213,40 +254,68 @@ dates using the `bin/csv_export_add_date.py` script. ``` -$ mv ~/Downloads/loggerDB /tmp/logger. -$ pwd +mv ~/Downloads/loggerDB /tmp/logger. +pwd .../e-mission-phone -$ python bin/csv_export_add_date.py /tmp/loggerDB. -$ less /tmp/loggerDB..withdate.log +python bin/csv_export_add_date.py /tmp/loggerDB. +less /tmp/loggerDB..withdate.log ``` -Contributing ---- - -Add the main repo as upstream - - $ git remote add upstream https://github.com/covid19database/phone-app.git - -Create a new branch (IMPORTANT). Please do not submit pull requests from master - - $ git checkout -b mybranch +## 6. Contributing -Make changes to the branch and commit them - $ git commit - -Push the changes to your local fork - - $ git push origin mybranch - -Generate a pull request from the UI +1. Add the main repo as upstream +``` +2. git remote add upstream +``` +3. Create a new branch (IMPORTANT). Please do not submit pull requests from master +``` +4. git checkout -b +``` +5. Make changes to the branch and commit them +``` +6. git commit +``` + 7. Push the changes to your local fork +``` +8. git push origin +``` +9. Generate a pull request from the UI -Address my review comments +__\*__Address my review comments__\*__ Once I merge the pull request, pull the changes to your fork and delete the branch ``` -$ git checkout master -$ git pull upstream master -$ git push origin master -$ git branch -d mybranch +git checkout master +``` +``` +git pull upstream master +``` +``` +git push origin master +``` +``` +git branch -d ``` + +--- +### Troubleshooting +1. Xcode command line tools +``` +Warning: No developer tools installed. +You should install the Command Line Tools. +``` +``` +xcode-select --install +``` + +2. Creating Logos +- Make sure to use `npx ionic` and `npx cordova`. This is + because the setup script installs all the modules locally in a self-contained + environment using `npm install` and not `npm install -g` +- Check the CI to see whether there is a known issue +- Run the commands from the script one by one and see which fails + - compare the failed command with the CI logs +- Another workaround is to delete the local environment and recreate it + - javascript errors: `rm -rf node_modules && npm install` + - native code compile errors: `rm -rf plugins && rm -rf platforms && npx cordova prepare` From 8ea506d1ce5ad113cb0cc86ec5f5cb425d815d7d Mon Sep 17 00:00:00 2001 From: niccolopaganini Date: Sat, 23 Sep 2023 13:18:38 -0600 Subject: [PATCH 03/34] build successful screenshot --- Build_ss.png | Bin 0 -> 83719 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Build_ss.png diff --git a/Build_ss.png b/Build_ss.png new file mode 100644 index 0000000000000000000000000000000000000000..18ab48b232d04ae28e72f5677d393045be584659 GIT binary patch literal 83719 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 literal 0 HcmV?d00001 From ed0e871645855418908da33ea3b148183caf2c93 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Sat, 23 Sep 2023 13:23:49 -0600 Subject: [PATCH 04/34] Update README.md - Added hyperlink to the title - Added output screenshot --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a14f99a01..5a25ba0e6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# e-mission phone app +# [e-mission phone app](https://github.com/e-mission/e-mission-phone/tree/master) __This is the phone component of the e-mission system.__ @@ -229,7 +229,8 @@ For instance: (build-dev-android) ``` npm run build-dev-android ``` - +Your output should look something like this: +![Build Successful Message screenshot](Build_ss.png) ## 4. End to End Testing From 54656b8d0992e9946b9cd20d86e843814d3b1f18 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Sat, 23 Sep 2023 13:29:52 -0600 Subject: [PATCH 05/34] Update README.md - Updating markdown anchors --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 5a25ba0e6..ed7c03d22 100644 --- a/README.md +++ b/README.md @@ -10,15 +10,16 @@ https://github.com/e-mission/e-mission-docs/tree/master/docs/e-mission-phone **Issues:** Since this repository is part of a larger project, all issues are tracked [in the central docs repository](https://github.com/e-mission/e-mission-docs/issues). If you have a question, [as suggested by the open source guide](https://opensource.guide/how-to-contribute/#communicating-effectively), please file an issue instead of sending an email. Since issues are public, other contributors can try to answer the question and benefit from the answer. -:sparkles: Check 6. Contributing if you're interested in contributing for this project :sparkles: +:sparkles: Check 6. [Contributing](#6-contributing) if you're interested in contributing for this project :sparkles: ## Contents -#### 1. [Creating logos](#1.-Creating-logos) -> Information regarding app Logo -#### 2. [Updating the UI only](#2.-Updating-the-UI-only) -> For UI changes ONLY -#### 3. [Updating the e-mission-* plugins or adding new plugins](#3.-Updating-the-e-mission-\*-plugins-or-adding-new-plugins) -> Work with native code -#### 4. [End to End Testing](#4.-End-to-End-Testing) -#### 5. [Beta-testing debugging](#5.-Beta-testing-debugging) -#### 6. [Contributing](#6.-Contributing) +#### 1. [Creating logos](#1-creating-logos) -> Information regarding app Logo +#### 2. [Updating the UI only](#2-updating-the-ui-only) -> For UI changes ONLY +#### 3. [Updating the e-mission-* plugins or adding new plugins](#3-updating-the-e-mission--plugins-or-adding-new-plugins) -> Work with native code +#### 4. [End to End Testing](#4-end-to-end-testing) +#### 5. [Beta-testing debugging](#5-beta-testing-debugging) +#### 6. [Contributing](#6-contributing) + --- ## 1. Creating logos From 290dcc5038c671abf733fb3288600435c3129973 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Sat, 23 Sep 2023 13:34:56 -0600 Subject: [PATCH 06/34] Update README.md Updating markdown anchors as 4,5, & 6 weren't working --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ed7c03d22..e9eb61229 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ https://github.com/e-mission/e-mission-docs/tree/master/docs/e-mission-phone **Issues:** Since this repository is part of a larger project, all issues are tracked [in the central docs repository](https://github.com/e-mission/e-mission-docs/issues). If you have a question, [as suggested by the open source guide](https://opensource.guide/how-to-contribute/#communicating-effectively), please file an issue instead of sending an email. Since issues are public, other contributors can try to answer the question and benefit from the answer. -:sparkles: Check 6. [Contributing](#6-contributing) if you're interested in contributing for this project :sparkles: +:sparkles: Check [6. Contributing](#6-contributing) if you're interested in contributing for this project :sparkles: ## Contents #### 1. [Creating logos](#1-creating-logos) -> Information regarding app Logo From 809fc5d4fe89e17c9f5d40dced40c41eb46f0a8a Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Sat, 23 Sep 2023 13:46:50 -0600 Subject: [PATCH 07/34] Update README.md - touch up - fixed non-working markdown anchors --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e9eb61229..e267f8e71 100644 --- a/README.md +++ b/README.md @@ -10,12 +10,12 @@ https://github.com/e-mission/e-mission-docs/tree/master/docs/e-mission-phone **Issues:** Since this repository is part of a larger project, all issues are tracked [in the central docs repository](https://github.com/e-mission/e-mission-docs/issues). If you have a question, [as suggested by the open source guide](https://opensource.guide/how-to-contribute/#communicating-effectively), please file an issue instead of sending an email. Since issues are public, other contributors can try to answer the question and benefit from the answer. -:sparkles: Check [6. Contributing](#6-contributing) if you're interested in contributing for this project :sparkles: +:sparkles: Check [Contributing](#6-contributing) if you're interested in contributing for this project :sparkles: ## Contents -#### 1. [Creating logos](#1-creating-logos) -> Information regarding app Logo -#### 2. [Updating the UI only](#2-updating-the-ui-only) -> For UI changes ONLY -#### 3. [Updating the e-mission-* plugins or adding new plugins](#3-updating-the-e-mission--plugins-or-adding-new-plugins) -> Work with native code +#### 1. [Creating logos](#1-creating-logos) +#### 2. [Updating the UI only](#2-updating-the-ui-only) +#### 3. [Updating the e-mission-* plugins or adding new plugins](#3-updating-the-e-mission--plugins-or-adding-new-plugins) #### 4. [End to End Testing](#4-end-to-end-testing) #### 5. [Beta-testing debugging](#5-beta-testing-debugging) #### 6. [Contributing](#6-contributing) From b64ab621b0325c95166950473807d67942dcb9b3 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Mon, 25 Sep 2023 00:29:30 -0600 Subject: [PATCH 08/34] Update README.md Removed manual numbering and updated markdown anchors --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index e267f8e71..76d56ea88 100644 --- a/README.md +++ b/README.md @@ -13,16 +13,16 @@ https://github.com/e-mission/e-mission-docs/tree/master/docs/e-mission-phone :sparkles: Check [Contributing](#6-contributing) if you're interested in contributing for this project :sparkles: ## Contents -#### 1. [Creating logos](#1-creating-logos) -#### 2. [Updating the UI only](#2-updating-the-ui-only) -#### 3. [Updating the e-mission-* plugins or adding new plugins](#3-updating-the-e-mission--plugins-or-adding-new-plugins) -#### 4. [End to End Testing](#4-end-to-end-testing) -#### 5. [Beta-testing debugging](#5-beta-testing-debugging) -#### 6. [Contributing](#6-contributing) +#### 1. [Creating logos](#creating-logos) +#### 2. [Updating the UI only](#updating-the-ui-only) +#### 3. [Updating the e-mission-* plugins or adding new plugins](#updating-the-e-mission--plugins-or-adding-new-plugins) +#### 4. [End to End Testing](#end-to-end-testing) +#### 5. [Beta-testing debugging](#beta-testing-debugging) +#### 6. [Contributing](#contributing) --- -## 1. Creating logos +## Creating logos If you are building your own version of the app, you must have your own logo to avoid app store conficts. Updating the logo is very simple using the [`ionic @@ -31,7 +31,7 @@ command. **Note**: You may have to install the [`cordova-res` package](https://github.com/ionic-team/cordova-res) for the command to work -## 2. Updating the UI only +## Updating the UI only [![osx-serve-install](https://github.com/e-mission/e-mission-phone/workflows/osx-serve-install/badge.svg)](https://github.com/e-mission/e-mission-phone/actions?query=workflow%3Aosx-serve-install) If you want to make only UI changes, (as opposed to modifying the existing plugins, adding new plugins, etc), you can use the **new and improved** (as of June 2018) [e-mission dev app](https://github.com/e-mission/e-mission-devapp/) and install the most recent version from [releases](https://github.com/e-mission/e-mission-devapp/releases). @@ -84,7 +84,7 @@ source setup/activate_serve.sh **Note1**: You may need to scroll up, past all the warnings about `Content Security Policy has been added` to find the port that the server is listening to. -## 3. Updating the e-mission-\* plugins or adding new plugins +## Updating the e-mission-\* plugins or adding new plugins [![osx-build-ios](https://github.com/e-mission/e-mission-phone/actions/workflows/ios-build.yml/badge.svg)](https://github.com/e-mission/e-mission-phone/actions/workflows/ios-build.yml) [![osx-build-android](https://github.com/e-mission/e-mission-phone/actions/workflows/android-build.yml/badge.svg)](https://github.com/e-mission/e-mission-phone/actions/workflows/android-build.yml) @@ -233,7 +233,7 @@ npm run build-dev-android Your output should look something like this: ![Build Successful Message screenshot](Build_ss.png) -## 4. End to End Testing +## End to End Testing A lot of the visualizations that we display in the phone client come from the server. In order to do end to end testing, we need to run a local server and connect to it. Instructions for: @@ -248,7 +248,7 @@ In order to make end to end testing easy, if the local server is started on a HT One advantage of using `skip` authentication in development mode is that any user email can be entered without a password. Developers can use one of the emails that they loaded test data for in step (3) above. So if the test data loaded was with `-u shankari@eecs.berkeley.edu`, then the login email for the phone app would also be `shankari@eecs.berkeley.edu`. -## 5. Beta-testing debugging +## Beta-testing debugging If users run into problems, they have the ability to email logs to the maintainer. These logs are in the form of an sqlite3 database, so they have to be opened using `sqlite3`. Alternatively, you can export it to a csv with @@ -263,7 +263,7 @@ python bin/csv_export_add_date.py /tmp/loggerDB. less /tmp/loggerDB..withdate.log ``` -## 6. Contributing +## Contributing 1. Add the main repo as upstream From 72922cff1c2fb2b4797106cf5bdcb0ead702700f Mon Sep 17 00:00:00 2001 From: niccolopaganini Date: Mon, 25 Sep 2023 00:42:26 -0600 Subject: [PATCH 09/34] 1. Changed expected output for plugins 2. Removed tested on sub-section 3. Revised formatting for activation sub-section -> for better clarity --- README.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 76d56ea88..0b19e492e 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ https://github.com/e-mission/e-mission-docs/tree/master/docs/e-mission-phone **Issues:** Since this repository is part of a larger project, all issues are tracked [in the central docs repository](https://github.com/e-mission/e-mission-docs/issues). If you have a question, [as suggested by the open source guide](https://opensource.guide/how-to-contribute/#communicating-effectively), please file an issue instead of sending an email. Since issues are public, other contributors can try to answer the question and benefit from the answer. -:sparkles: Check [Contributing](#6-contributing) if you're interested in contributing for this project :sparkles: +:sparkles: Check [Contributing](#contributing) if you're interested in contributing for this project :sparkles: ## Contents #### 1. [Creating logos](#creating-logos) @@ -101,13 +101,6 @@ have now: If you have setup failures, please compare the configuration in the **passing CI builds** with your configuration. That is almost certainly the source of the error. -### Tested on -__MacOS__ -- Intel chip, MacOS Ventura 13.6 -- Intel chip, MacOS Ventura 13.5.2 -- Intel chip, MacOS Ventura 13.0 -- Intel chip, MacOS Monterey 12.6.7 - Pre-requisites --- - The version of xcode used by the CI. @@ -196,9 +189,8 @@ If connecting to a development server over http, make sure to turn on http suppo ``` -__3. Run this in every new shell__ +__3. Run this in every new shell for Activation__ -- __Activation__ ``` source setup/activate_native.sh ``` @@ -218,8 +210,9 @@ Copied config.cordovabuild.xml -> config.xml and package.cordovabuild.json -> pa ``` +
-- __Pick a type of build and execute the following:__ + __4. Pick a type of build and execute the following:__ More "versions" are available in [`package.cordovabuild.json`](https://github.com/e-mission/e-mission-phone/blob/fce117ff859abd995613bd405dbc7d27c703b09b/package.cordovabuild.json) ``` @@ -230,8 +223,17 @@ For instance: (build-dev-android) ``` npm run build-dev-android ``` -Your output should look something like this: -![Build Successful Message screenshot](Build_ss.png) +
Your expected output should look something like this + +``` +BUILD SUCCESSFUL in 2m 48s +52 actionable tasks: 52 executed +Built the following apk(s): +/Users//e-mission-phone/platforms/android/app/build/outputs/apk/debug/app-debug.apk +``` + +
+ ## End to End Testing From 92ce70760b3eed6b1c05b4fea9a82f5a1b361649 Mon Sep 17 00:00:00 2001 From: niccolopaganini Date: Fri, 29 Sep 2023 09:54:52 -0600 Subject: [PATCH 10/34] 1. reformatted to the original structure 2. removed floating links --- README.md | 56 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 0b19e492e..ca3e9c93b 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,9 @@ __This is the phone component of the e-mission system.__ -:sparkles: This has now been upgraded to cordova android@12.0.0 and iOS@6.2.0. It has also been upgraded to [android API 33 and the latest iOS versions](https://github.com/e-mission/e-mission-docs/issues/934), [cordova-lib@10.0.0 and the most recent node and npm versions](). It also now supports CI, so we should not have any build issues in the future. __This should be ready to build out of the box.__ +:sparkles: This has now been upgraded to cordova android@12.0.0 and iOS@6.2.0. It has also been upgraded to the **latest Android & iOS versions**, **cordova-lib@10.0.0 and the most recent node and npm versions**. It also now supports CI, so we should not have any build issues in the future. __This should be ready to build out of the box.__ + +For the latest versions, refer [`package.cordovabuild.json`](https://github.com/e-mission/e-mission-phone/blob/fce117ff859abd995613bd405dbc7d27c703b09b/package.cordovabuild.json) ## Additional Documentation Additional documentation has been moved to its own repository [e-mission-docs](https://github.com/e-mission/e-mission-docs). Specific e-mission-phone wikis can be found here: @@ -22,14 +24,6 @@ https://github.com/e-mission/e-mission-docs/tree/master/docs/e-mission-phone --- -## Creating logos - -If you are building your own version of the app, you must have your own logo to -avoid app store conficts. Updating the logo is very simple using the [`ionic -cordova resources`](https://ionicframework.com/docs/v3/cli/cordova/resources/) -command. - -**Note**: You may have to install the [`cordova-res` package](https://github.com/ionic-team/cordova-res) for the command to work ## Updating the UI only [![osx-serve-install](https://github.com/e-mission/e-mission-phone/workflows/osx-serve-install/badge.svg)](https://github.com/e-mission/e-mission-phone/actions?query=workflow%3Aosx-serve-install) @@ -84,6 +78,21 @@ source setup/activate_serve.sh **Note1**: You may need to scroll up, past all the warnings about `Content Security Policy has been added` to find the port that the server is listening to. +## End to End Testing + +A lot of the visualizations that we display in the phone client come from the server. In order to do end to end testing, we need to run a local server and connect to it. Instructions for: + +1. installing a local server, +2. running it, +3. loading it with test data, and +4. running analysis on it + +are available in the [e-mission-server README](https://github.com/e-mission/e-mission-server/blob/master/README.md). + +In order to make end to end testing easy, if the local server is started on a HTTP (versus HTTPS port), it is in development mode. By default, the phone app connects to the local server (localhost on iOS, [10.0.2.2 on android](https://stackoverflow.com/questions/5806220/how-to-connect-to-my-http-localhost-web-server-from-android-emulator-in-eclips)) with the `prompted-auth` authentication method. To connect to a different server, or to use a different authentication method, you need to create a `www/json/connectionConfig.json` file. More details on configuring authentication [can be found in the docs](https://github.com/e-mission/e-mission-docs/blob/master/docs/install/configuring_authentication.md). + +One advantage of using `skip` authentication in development mode is that any user email can be entered without a password. Developers can use one of the emails that they loaded test data for in step (3) above. So if the test data loaded was with `-u shankari@eecs.berkeley.edu`, then the login email for the phone app would also be `shankari@eecs.berkeley.edu`. + ## Updating the e-mission-\* plugins or adding new plugins [![osx-build-ios](https://github.com/e-mission/e-mission-phone/actions/workflows/ios-build.yml/badge.svg)](https://github.com/e-mission/e-mission-phone/actions/workflows/ios-build.yml) @@ -109,7 +118,7 @@ Pre-requisites - **NOTE**: the basic xcode install on Catalina was messed up for me due to a prior installation of command line tools. [These workarounds helped](https://github.com/nodejs/node-gyp/blob/master/macOS_Catalina.md). - git - Java 17. Tested with [OpenJDK 17 (Temurin) using AdoptOpenJDK](https://adoptium.net). -- if you are not on the most recent version of OSX: `homebrew` +- Always use [homebrew](https://brew.sh) in addition to CLI - this allows us to install the current version of cocoapods without running into ruby incompatibilities - e.g. https://github.com/CocoaPods/CocoaPods/issues/11763 @@ -234,21 +243,16 @@ Built the following apk(s): +
-## End to End Testing - -A lot of the visualizations that we display in the phone client come from the server. In order to do end to end testing, we need to run a local server and connect to it. Instructions for: - -1. installing a local server, -2. running it, -3. loading it with test data, and -4. running analysis on it - -are available in the [e-mission-server README](https://github.com/e-mission/e-mission-server/blob/master/README.md). +## Creating logos -In order to make end to end testing easy, if the local server is started on a HTTP (versus HTTPS port), it is in development mode. By default, the phone app connects to the local server (localhost on iOS, [10.0.2.2 on android](https://stackoverflow.com/questions/5806220/how-to-connect-to-my-http-localhost-web-server-from-android-emulator-in-eclips)) with the `prompted-auth` authentication method. To connect to a different server, or to use a different authentication method, you need to create a `www/json/connectionConfig.json` file. More details on configuring authentication [can be found in the docs](https://github.com/e-mission/e-mission-docs/blob/master/docs/install/configuring_authentication.md). +If you are building your own version of the app, you must have your own logo to +avoid app store conficts. Updating the logo is very simple using the [`ionic +cordova resources`](https://ionicframework.com/docs/v3/cli/cordova/resources/) +command. -One advantage of using `skip` authentication in development mode is that any user email can be entered without a password. Developers can use one of the emails that they loaded test data for in step (3) above. So if the test data loaded was with `-u shankari@eecs.berkeley.edu`, then the login email for the phone app would also be `shankari@eecs.berkeley.edu`. +**Note**: You may have to install the [`cordova-res` package](https://github.com/ionic-team/cordova-res) for the command to work ## Beta-testing debugging If users run into problems, they have the ability to email logs to the @@ -288,7 +292,7 @@ less /tmp/loggerDB..withdate.log __\*__Address my review comments__\*__ -Once I merge the pull request, pull the changes to your fork and delete the branch +Once I merge the pull request :smiley: :tada:, pull the changes to your fork and delete the branch ``` git checkout master ``` @@ -304,7 +308,7 @@ git branch -d --- ### Troubleshooting -1. Xcode command line tools +__1. Xcode command line tools__ ``` Warning: No developer tools installed. You should install the Command Line Tools. @@ -313,7 +317,7 @@ You should install the Command Line Tools. xcode-select --install ``` -2. Creating Logos +__2. Creating Logos__ - Make sure to use `npx ionic` and `npx cordova`. This is because the setup script installs all the modules locally in a self-contained environment using `npm install` and not `npm install -g` @@ -323,3 +327,5 @@ xcode-select --install - Another workaround is to delete the local environment and recreate it - javascript errors: `rm -rf node_modules && npm install` - native code compile errors: `rm -rf plugins && rm -rf platforms && npx cordova prepare` + +3. From 3d5e99bb974a641f144f1cbfedf9d7ac7247ea71 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Fri, 29 Sep 2023 10:02:33 -0600 Subject: [PATCH 11/34] Update README.md 1. Removed instructions on JAVA_HOME as it is no longer required 2. Quality of life changes --- README.md | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index ca3e9c93b..34184ab09 100644 --- a/README.md +++ b/README.md @@ -132,19 +132,6 @@ export ANDROID_HOME="/Users//Library/Android/sdk" ``` aka the path where you want the SDK to be installed. -To setup JAVA_HOME (after installing the latest JDK ), run this command: -``` -/usr/libexec/java_home -``` -Find the location of the Java installation (Default will look something like this:) -``` -/Library/Java/JavaVirtualMachines/... -``` -and then export the package as: -``` -export JAVA_HOME="" -``` - - android SDK; install manually or use setup script below (**recommended**). Note that you only need to run this once **per computer**. ``` bash setup/prereq_android_sdk_install.sh @@ -178,7 +165,9 @@ __2. Installing (one time only)__ ``` bash setup/setup_android_native.sh +``` AND/OR +``` bash setup/setup_ios_native.sh ``` From 03bc5c368c465c7ba8e6ec68873de51ae2d0a630 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Fri, 29 Sep 2023 16:21:34 -0600 Subject: [PATCH 12/34] Update README.md 1. Changed the content section 2. Updated links in "Contributing" section 3. Updated "end to end testing" section --- README.md | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 34184ab09..6292c41b1 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ # [e-mission phone app](https://github.com/e-mission/e-mission-phone/tree/master) -__This is the phone component of the e-mission system.__ +__This is the phone component of the e-mission system.__ :sparkles: This has now been upgraded to cordova android@12.0.0 and iOS@6.2.0. It has also been upgraded to the **latest Android & iOS versions**, **cordova-lib@10.0.0 and the most recent node and npm versions**. It also now supports CI, so we should not have any build issues in the future. __This should be ready to build out of the box.__ +✨ We constantly upgrade the repo to the latest cordova versions of android, iOS, cordova-lib, and the most recent node and npm versions. The CI will be up-to-date. + For the latest versions, refer [`package.cordovabuild.json`](https://github.com/e-mission/e-mission-phone/blob/fce117ff859abd995613bd405dbc7d27c703b09b/package.cordovabuild.json) ## Additional Documentation @@ -15,12 +17,13 @@ https://github.com/e-mission/e-mission-docs/tree/master/docs/e-mission-phone :sparkles: Check [Contributing](#contributing) if you're interested in contributing for this project :sparkles: ## Contents -#### 1. [Creating logos](#creating-logos) -#### 2. [Updating the UI only](#updating-the-ui-only) -#### 3. [Updating the e-mission-* plugins or adding new plugins](#updating-the-e-mission--plugins-or-adding-new-plugins) +#### 1. [Updating the UI only](#updating-the-ui-only) +#### 2. [Updating the e-mission-* plugins or adding new plugins](#updating-the-e-mission--plugins-or-adding-new-plugins) +#### 3. [Creating logos](#creating-logos) #### 4. [End to End Testing](#end-to-end-testing) #### 5. [Beta-testing debugging](#beta-testing-debugging) #### 6. [Contributing](#contributing) +#### 7. [Troubleshooting](#troubleshooting) --- @@ -80,7 +83,7 @@ source setup/activate_serve.sh ## End to End Testing -A lot of the visualizations that we display in the phone client come from the server. In order to do end to end testing, we need to run a local server and connect to it. Instructions for: +A lot of the visualizations that we display in the phone client come from the server. In order to do end-to-end testing, we need to run a local server and connect to it. Instructions for: 1. installing a local server, 2. running it, @@ -89,7 +92,11 @@ A lot of the visualizations that we display in the phone client come from the se are available in the [e-mission-server README](https://github.com/e-mission/e-mission-server/blob/master/README.md). -In order to make end to end testing easy, if the local server is started on a HTTP (versus HTTPS port), it is in development mode. By default, the phone app connects to the local server (localhost on iOS, [10.0.2.2 on android](https://stackoverflow.com/questions/5806220/how-to-connect-to-my-http-localhost-web-server-from-android-emulator-in-eclips)) with the `prompted-auth` authentication method. To connect to a different server, or to use a different authentication method, you need to create a `www/json/connectionConfig.json` file. More details on configuring authentication [can be found in the docs](https://github.com/e-mission/e-mission-docs/blob/master/docs/install/configuring_authentication.md). +In order to make end-to-end testing easy, if the local server is started on a HTTP (versus HTTPS port), it is in development mode. By default, the phone app connects to the local server (localhost on iOS, [10.0.2.2 on android](https://stackoverflow.com/questions/5806220/how-to-connect-to-my-http-localhost-web-server-from-android-emulator-in-eclips)) with the `prompted-auth` authentication method. To connect to a different server, or to use a different authentication method, you need to modify the [nrel-commute.nrel-op.json](https://github.com/e-mission/nrel-openpath-deploy-configs/blob/482971d9715e8d52862e689658f9b4f2437e6401/configs/nrel-commute.nrel-op.json) file's dynamic config. +``` +"connectUrl": "https://nrel-commute-openpath.nrel.gov/api/" +``` +More details on configuring authentication [can be found in the docs](https://github.com/e-mission/e-mission-docs/blob/master/docs/install/configuring_authentication.md). One advantage of using `skip` authentication in development mode is that any user email can be entered without a password. Developers can use one of the emails that they loaded test data for in step (3) above. So if the test data loaded was with `-u shankari@eecs.berkeley.edu`, then the login email for the phone app would also be `shankari@eecs.berkeley.edu`. @@ -115,7 +122,6 @@ Pre-requisites - The version of xcode used by the CI. - to install a particular version, use [xcode-select](https://www.unix.com/man-page/OSX/1/xcode-select/) - or this [supposedly easier to use repo](https://github.com/xcpretty/xcode-install) - - **NOTE**: the basic xcode install on Catalina was messed up for me due to a prior installation of command line tools. [These workarounds helped](https://github.com/nodejs/node-gyp/blob/master/macOS_Catalina.md). - git - Java 17. Tested with [OpenJDK 17 (Temurin) using AdoptOpenJDK](https://adoptium.net). - Always use [homebrew](https://brew.sh) in addition to CLI @@ -263,21 +269,23 @@ less /tmp/loggerDB..withdate.log 1. Add the main repo as upstream ``` -2. git remote add upstream +git remote add upstream https://github.com/e-mission/e-mission-phone ``` -3. Create a new branch (IMPORTANT). Please do not submit pull requests from master +2. Create a new branch (IMPORTANT). Please do not submit pull requests from master ``` -4. git checkout -b +git checkout -b ``` -5. Make changes to the branch and commit them +3. Make changes to the branch and commit them ``` -6. git commit +git commit ``` - 7. Push the changes to your local fork +4. Push the changes to your local fork ``` -8. git push origin +git push origin ``` -9. Generate a pull request from the UI +5. Generate a pull request from the UI + +
__\*__Address my review comments__\*__ @@ -317,4 +325,6 @@ __2. Creating Logos__ - javascript errors: `rm -rf node_modules && npm install` - native code compile errors: `rm -rf plugins && rm -rf platforms && npx cordova prepare` -3. +3. (For updating the e-mission-plugins or adding new plugins) **NOTE**: the basic xcode install on Catalina was messed up for me due to a prior installation of command line tools. [These workarounds helped](https://github.com/nodejs/node-gyp/blob/master/macOS_Catalina.md). + +4. From 4d4d57dbb736023342e58c373724227e0cb71822 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Fri, 29 Sep 2023 20:48:46 -0600 Subject: [PATCH 13/34] Update README.md 1. Updated buttons to point to the right CI 2. Removed point no. 4 in troubleshooting (it was empty) --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 6292c41b1..80abc7872 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ https://github.com/e-mission/e-mission-docs/tree/master/docs/e-mission-phone ## Updating the UI only -[![osx-serve-install](https://github.com/e-mission/e-mission-phone/workflows/osx-serve-install/badge.svg)](https://github.com/e-mission/e-mission-phone/actions?query=workflow%3Aosx-serve-install) +[![osx-serve-install](https://github.com/e-mission/e-mission-phone/workflows/osx-serve-install/badge.svg)](https://github.com/e-mission/e-mission-phone/actions/workflows/serve-install.yml) If you want to make only UI changes, (as opposed to modifying the existing plugins, adding new plugins, etc), you can use the **new and improved** (as of June 2018) [e-mission dev app](https://github.com/e-mission/e-mission-devapp/) and install the most recent version from [releases](https://github.com/e-mission/e-mission-devapp/releases). @@ -326,5 +326,3 @@ __2. Creating Logos__ - native code compile errors: `rm -rf plugins && rm -rf platforms && npx cordova prepare` 3. (For updating the e-mission-plugins or adding new plugins) **NOTE**: the basic xcode install on Catalina was messed up for me due to a prior installation of command line tools. [These workarounds helped](https://github.com/nodejs/node-gyp/blob/master/macOS_Catalina.md). - -4. From bbf18bdb939f9a30670cda10c54de4c66a251c84 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Fri, 29 Sep 2023 20:50:39 -0600 Subject: [PATCH 14/34] Update README.md Made sure the links for the buttons are correct --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 80abc7872..25f54d061 100644 --- a/README.md +++ b/README.md @@ -325,4 +325,4 @@ __2. Creating Logos__ - javascript errors: `rm -rf node_modules && npm install` - native code compile errors: `rm -rf plugins && rm -rf platforms && npx cordova prepare` -3. (For updating the e-mission-plugins or adding new plugins) **NOTE**: the basic xcode install on Catalina was messed up for me due to a prior installation of command line tools. [These workarounds helped](https://github.com/nodejs/node-gyp/blob/master/macOS_Catalina.md). +3. (For updating the e-mission-plugins or adding new plugins) **NOTE**: the basic xcode install on Mac OS Catalina was messed up for me due to a prior installation of command line tools. [These workarounds helped](https://github.com/nodejs/node-gyp/blob/master/macOS_Catalina.md). From 4da919f8c37a0802da85476532888a281ce0e33e Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Sat, 30 Sep 2023 15:51:09 -0600 Subject: [PATCH 15/34] Update README.md 1. Removed manual numbering 2. Removed any form of version numbers 3. Removed certain Permalinks and swapped it with relative PATHs 4. Made sure the structure is same --- README.md | 79 ++++++++++++++++++++++++++----------------------------- 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 25f54d061..7f8b62c29 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ __This is the phone component of the e-mission system.__ -:sparkles: This has now been upgraded to cordova android@12.0.0 and iOS@6.2.0. It has also been upgraded to the **latest Android & iOS versions**, **cordova-lib@10.0.0 and the most recent node and npm versions**. It also now supports CI, so we should not have any build issues in the future. __This should be ready to build out of the box.__ +:sparkles: This has been upgraded to the latest **Android**, **iOS**, **cordova-lib**, **node** and **npm** versions. __This is ready to build out of the box.__ ✨ We constantly upgrade the repo to the latest cordova versions of android, iOS, cordova-lib, and the most recent node and npm versions. The CI will be up-to-date. -For the latest versions, refer [`package.cordovabuild.json`](https://github.com/e-mission/e-mission-phone/blob/fce117ff859abd995613bd405dbc7d27c703b09b/package.cordovabuild.json) +For the latest versions, refer [`package.cordovabuild.json`](package.cordovabuild.json) ## Additional Documentation Additional documentation has been moved to its own repository [e-mission-docs](https://github.com/e-mission/e-mission-docs). Specific e-mission-phone wikis can be found here: @@ -35,7 +35,7 @@ If you want to make only UI changes, (as opposed to modifying the existing plugi ### Installing (one-time) -1. Run the setup script +:point_right:Run the setup script ``` bash setup/setup_serve.sh @@ -50,17 +50,16 @@ cp ..... www/json/connectionConfig.json ``` ### Activation (after install, and in every new shell) -2. Run this to activate ``` source setup/activate_serve.sh ``` ### Running -1. Start the phonegap deployment server and note the URL(s) that the server is listening to. +Start the phonegap deployment server and note the URL(s) that the server is listening to. - ``` - npm run serve + + npm run serve .... [phonegap] listening on 10.0.0.14:3000 [phonegap] listening on 192.168.162.1:3000 @@ -68,12 +67,11 @@ source setup/activate_serve.sh [phonegap] ctrl-c to stop the server [phonegap] .... - ``` -2. Change the devapp connection URL to one of these (e.g. 192.168.162.1:3000) and press "Connect" -3. The app will now display the version of e-mission app that is in your local directory - 4. The console logs will be displayed back in the server window (prefaced by `[console]`) - 5. Breakpoints can be added by connecting through the browser +Change the devapp connection URL to one of these (e.g. 192.168.162.1:3000) and press "Connect" +The app will now display the version of e-mission app that is in your local directory +The console logs will be displayed back in the server window (prefaced by `[console]`) +Breakpoints can be added by connecting through the browser - Safari ([enable develop menu](https://support.apple.com/guide/safari/use-the-safari-develop-menu-sfri20948/mac)): Develop -> Simulator -> index.html - Chrome: chrome://inspect -> Remote target (emulator) @@ -105,18 +103,6 @@ One advantage of using `skip` authentication in development mode is that any use [![osx-build-ios](https://github.com/e-mission/e-mission-phone/actions/workflows/ios-build.yml/badge.svg)](https://github.com/e-mission/e-mission-phone/actions/workflows/ios-build.yml) [![osx-build-android](https://github.com/e-mission/e-mission-phone/actions/workflows/android-build.yml/badge.svg)](https://github.com/e-mission/e-mission-phone/actions/workflows/android-build.yml) -__Important__ - -Most of the recent issues encountered have been due to incompatible setup. We -have now: -- locked down the dependencies, -- created setup and teardown scripts to setup self-contained environments with - those dependencies, and -- CI enabled to validate that they continue work. - -If you have setup failures, please compare the configuration in the **passing CI -builds** with your configuration. That is almost certainly the source of the error. - Pre-requisites --- - The version of xcode used by the CI. @@ -129,7 +115,19 @@ Pre-requisites running into ruby incompatibilities - e.g. https://github.com/CocoaPods/CocoaPods/issues/11763 -__1. Export statements__ +:triangular_flag_on_post: __Important__ + +Most of the recent issues encountered have been due to incompatible setup. We +have now: +- locked down the dependencies, +- created setup and teardown scripts to setup self-contained environments with + those dependencies, and +- CI enabled to validate that they continue work. + +If you have setup failures, please compare the configuration in the **passing CI +builds** with your configuration. That is almost certainly the source of the error. + +__Export statements__ ``` export ANDROID_SDK_ROOT="/Users//Library/Android/sdk" ``` @@ -165,7 +163,7 @@ aka the path where you want the SDK to be installed. -__2. Installing (one time only)__ +__Installing (one time only)__ - Run the setup script for the platform you want to build @@ -193,7 +191,7 @@ If connecting to a development server over http, make sure to turn on http suppo ``` -__3. Run this in every new shell for Activation__ +__Run this in every new shell for Activation__ ``` source setup/activate_native.sh @@ -202,9 +200,9 @@ source setup/activate_native.sh ``` Activating nvm -Using version 19.5.0 -Now using node v19.5.0 (npm v9.3.1) -npm version = 9.3.1 +Using version +Now using node (npm ) +npm version = Adding cocoapods to the path Verifying /Users//Library/Android/sk or /Users//Library/Android/sdk is set Activating sdkman, and by default, gradle @@ -216,9 +214,9 @@ Copied config.cordovabuild.xml -> config.xml and package.cordovabuild.json -> pa
- __4. Pick a type of build and execute the following:__ + __Pick a type of build and execute the following:__ -More "versions" are available in [`package.cordovabuild.json`](https://github.com/e-mission/e-mission-phone/blob/fce117ff859abd995613bd405dbc7d27c703b09b/package.cordovabuild.json) +More "versions" are available in [`package.cordovabuild.json`](package.cordovabuild.json) ``` npm run ``` @@ -266,24 +264,23 @@ less /tmp/loggerDB..withdate.log ## Contributing - -1. Add the main repo as upstream +:point_right:Add the main repo as upstream ``` git remote add upstream https://github.com/e-mission/e-mission-phone ``` -2. Create a new branch (IMPORTANT). Please do not submit pull requests from master +:point_right:Create a new branch (IMPORTANT). Please do not submit pull requests from master ``` git checkout -b ``` -3. Make changes to the branch and commit them +:point_right:Make changes to the branch and commit them ``` git commit ``` -4. Push the changes to your local fork +:point_right:Push the changes to your local fork ``` git push origin ``` -5. Generate a pull request from the UI +:point_right:Generate a pull request from the UI
@@ -305,7 +302,7 @@ git branch -d --- ### Troubleshooting -__1. Xcode command line tools__ +:point_right:Xcode command line tools ``` Warning: No developer tools installed. You should install the Command Line Tools. @@ -314,7 +311,7 @@ You should install the Command Line Tools. xcode-select --install ``` -__2. Creating Logos__ +:point_right:Creating Logos - Make sure to use `npx ionic` and `npx cordova`. This is because the setup script installs all the modules locally in a self-contained environment using `npm install` and not `npm install -g` @@ -325,4 +322,4 @@ __2. Creating Logos__ - javascript errors: `rm -rf node_modules && npm install` - native code compile errors: `rm -rf plugins && rm -rf platforms && npx cordova prepare` -3. (For updating the e-mission-plugins or adding new plugins) **NOTE**: the basic xcode install on Mac OS Catalina was messed up for me due to a prior installation of command line tools. [These workarounds helped](https://github.com/nodejs/node-gyp/blob/master/macOS_Catalina.md). +(For updating the e-mission-plugins or adding new plugins) **NOTE**: the basic xcode install on Mac OS Catalina was messed up for me due to a prior installation of command line tools. [These workarounds helped](https://github.com/nodejs/node-gyp/blob/master/macOS_Catalina.md). From e8cbcb5cb4a2feaf20f7d6762e43ba8d47b44533 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Sun, 1 Oct 2023 12:06:04 -0600 Subject: [PATCH 16/34] Update README.md iter 1 - fix end to end testing --- README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7f8b62c29..f079fe014 100644 --- a/README.md +++ b/README.md @@ -90,11 +90,9 @@ A lot of the visualizations that we display in the phone client come from the se are available in the [e-mission-server README](https://github.com/e-mission/e-mission-server/blob/master/README.md). -In order to make end-to-end testing easy, if the local server is started on a HTTP (versus HTTPS port), it is in development mode. By default, the phone app connects to the local server (localhost on iOS, [10.0.2.2 on android](https://stackoverflow.com/questions/5806220/how-to-connect-to-my-http-localhost-web-server-from-android-emulator-in-eclips)) with the `prompted-auth` authentication method. To connect to a different server, or to use a different authentication method, you need to modify the [nrel-commute.nrel-op.json](https://github.com/e-mission/nrel-openpath-deploy-configs/blob/482971d9715e8d52862e689658f9b4f2437e6401/configs/nrel-commute.nrel-op.json) file's dynamic config. -``` -"connectUrl": "https://nrel-commute-openpath.nrel.gov/api/" -``` -More details on configuring authentication [can be found in the docs](https://github.com/e-mission/e-mission-docs/blob/master/docs/install/configuring_authentication.md). +In order to make end-to-end testing even easier, we have moved from phone app to a dynamic config setting. We use the dynamic [config](configs) where each file upholds a function. Refer [Doc](https://github.com/e-mission/nrel-openpath-deploy-configs) + +If you have the [e-mission-server](https://github.com/e-mission/e-mission-server) running at a specific URL or IP address, and they want to connect to it, you would have to specify that URL or IP in the server field of their dynamic config file. One advantage of using `skip` authentication in development mode is that any user email can be entered without a password. Developers can use one of the emails that they loaded test data for in step (3) above. So if the test data loaded was with `-u shankari@eecs.berkeley.edu`, then the login email for the phone app would also be `shankari@eecs.berkeley.edu`. From 498e04e9da46c5ad55ff2c9df98ff20c59aea840 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Mon, 2 Oct 2023 08:53:27 -0600 Subject: [PATCH 17/34] Delete Build_ss.png Not required anymore --- Build_ss.png | Bin 83719 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Build_ss.png diff --git a/Build_ss.png b/Build_ss.png deleted file mode 100644 index 18ab48b232d04ae28e72f5677d393045be584659..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83719 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 From f4f3e6858e6696b3d0cdae4f6f7ab37d90333a44 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Mon, 2 Oct 2023 09:07:07 -0600 Subject: [PATCH 18/34] Update README.md - Better wordings --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f079fe014..6de8fcec1 100644 --- a/README.md +++ b/README.md @@ -90,9 +90,9 @@ A lot of the visualizations that we display in the phone client come from the se are available in the [e-mission-server README](https://github.com/e-mission/e-mission-server/blob/master/README.md). -In order to make end-to-end testing even easier, we have moved from phone app to a dynamic config setting. We use the dynamic [config](configs) where each file upholds a function. Refer [Doc](https://github.com/e-mission/nrel-openpath-deploy-configs) +In order to make end-to-end testing even easier, we have moved from phone app to a dynamic config setting. We use the dynamic [config](configs) to specify the server locations. Refer [Doc](https://github.com/e-mission/nrel-openpath-deploy-configs) -If you have the [e-mission-server](https://github.com/e-mission/e-mission-server) running at a specific URL or IP address, and they want to connect to it, you would have to specify that URL or IP in the server field of their dynamic config file. +If you have the [e-mission-server](https://github.com/e-mission/e-mission-server) running at a specific URL or IP address, and they want to connect to it, you would have to specify that URL or IP in the server of your dynamic config file. One advantage of using `skip` authentication in development mode is that any user email can be entered without a password. Developers can use one of the emails that they loaded test data for in step (3) above. So if the test data loaded was with `-u shankari@eecs.berkeley.edu`, then the login email for the phone app would also be `shankari@eecs.berkeley.edu`. From e1a6a32db1861ce686c85abc81d2a84db4ce3a35 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Mon, 2 Oct 2023 09:08:22 -0600 Subject: [PATCH 19/34] Update README.md - Removed relative PATH for dynamic links as they don't seem to work --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6de8fcec1..db401d00b 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ A lot of the visualizations that we display in the phone client come from the se are available in the [e-mission-server README](https://github.com/e-mission/e-mission-server/blob/master/README.md). -In order to make end-to-end testing even easier, we have moved from phone app to a dynamic config setting. We use the dynamic [config](configs) to specify the server locations. Refer [Doc](https://github.com/e-mission/nrel-openpath-deploy-configs) +In order to make end-to-end testing even easier, we have moved from phone app to a dynamic config setting. We use the dynamic config to specify the server locations. Refer [Doc](https://github.com/e-mission/nrel-openpath-deploy-configs) If you have the [e-mission-server](https://github.com/e-mission/e-mission-server) running at a specific URL or IP address, and they want to connect to it, you would have to specify that URL or IP in the server of your dynamic config file. From 693852dda0d1310998029a2f1da4ce8a3347b2e8 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Mon, 2 Oct 2023 13:13:58 -0600 Subject: [PATCH 20/34] Update README.md Modified the server to `server` --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index db401d00b..9ac9ceb1d 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ are available in the [e-mission-server README](https://github.com/e-mission/e-mi In order to make end-to-end testing even easier, we have moved from phone app to a dynamic config setting. We use the dynamic config to specify the server locations. Refer [Doc](https://github.com/e-mission/nrel-openpath-deploy-configs) -If you have the [e-mission-server](https://github.com/e-mission/e-mission-server) running at a specific URL or IP address, and they want to connect to it, you would have to specify that URL or IP in the server of your dynamic config file. +If you have the [e-mission-server](https://github.com/e-mission/e-mission-server) running at a specific URL or IP address, and you want to connect to it, you would have to specify that URL or IP in the `server` field of your dynamic config file. One advantage of using `skip` authentication in development mode is that any user email can be entered without a password. Developers can use one of the emails that they loaded test data for in step (3) above. So if the test data loaded was with `-u shankari@eecs.berkeley.edu`, then the login email for the phone app would also be `shankari@eecs.berkeley.edu`. From 32596a8e36174d0f98f7e9ad211627a3f9c99c7e Mon Sep 17 00:00:00 2001 From: niccolopaganini Date: Mon, 9 Oct 2023 12:00:03 -0600 Subject: [PATCH 21/34] Updated README file: Restored to the original - 1. Removed versions 2. Added CI badge 3. Plugins installation guide updated --- README.md | 238 +++++++++++++++++++++++++----------------------------- 1 file changed, 108 insertions(+), 130 deletions(-) diff --git a/README.md b/README.md index 9ac9ceb1d..7fca214aa 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,41 @@ -# [e-mission phone app](https://github.com/e-mission/e-mission-phone/tree/master) +e-mission phone app +-------------------- -__This is the phone component of the e-mission system.__ +This is the phone component of the e-mission system. :sparkles: This has been upgraded to the latest **Android**, **iOS**, **cordova-lib**, **node** and **npm** versions. __This is ready to build out of the box.__ -✨ We constantly upgrade the repo to the latest cordova versions of android, iOS, cordova-lib, and the most recent node and npm versions. The CI will be up-to-date. - For the latest versions, refer [`package.cordovabuild.json`](package.cordovabuild.json) -## Additional Documentation +Additional Documentation +--- Additional documentation has been moved to its own repository [e-mission-docs](https://github.com/e-mission/e-mission-docs). Specific e-mission-phone wikis can be found here: https://github.com/e-mission/e-mission-docs/tree/master/docs/e-mission-phone **Issues:** Since this repository is part of a larger project, all issues are tracked [in the central docs repository](https://github.com/e-mission/e-mission-docs/issues). If you have a question, [as suggested by the open source guide](https://opensource.guide/how-to-contribute/#communicating-effectively), please file an issue instead of sending an email. Since issues are public, other contributors can try to answer the question and benefit from the answer. -:sparkles: Check [Contributing](#contributing) if you're interested in contributing for this project :sparkles: - ## Contents #### 1. [Updating the UI only](#updating-the-ui-only) -#### 2. [Updating the e-mission-* plugins or adding new plugins](#updating-the-e-mission--plugins-or-adding-new-plugins) -#### 3. [Creating logos](#creating-logos) -#### 4. [End to End Testing](#end-to-end-testing) +#### 2. [End to End Testing](#end-to-end-testing) +#### 3. [Updating the e-mission-* plugins or adding new plugins](#updating-the-e-mission--plugins-or-adding-new-plugins) +#### 4. [Creating logos](#creating-logos) #### 5. [Beta-testing debugging](#beta-testing-debugging) #### 6. [Contributing](#contributing) -#### 7. [Troubleshooting](#troubleshooting) +Updating the UI only --- - - -## Updating the UI only -[![osx-serve-install](https://github.com/e-mission/e-mission-phone/workflows/osx-serve-install/badge.svg)](https://github.com/e-mission/e-mission-phone/actions/workflows/serve-install.yml) +[![osx-serve-install](https://github.com/e-mission/e-mission-phone/workflows/osx-serve-install/badge.svg)](https://github.com/e-mission/e-mission-phone/actions?query=workflow%3Aosx-serve-install) If you want to make only UI changes, (as opposed to modifying the existing plugins, adding new plugins, etc), you can use the **new and improved** (as of June 2018) [e-mission dev app](https://github.com/e-mission/e-mission-devapp/) and install the most recent version from [releases](https://github.com/e-mission/e-mission-devapp/releases). ### Installing (one-time) -:point_right:Run the setup script +Run the setup script ``` bash setup/setup_serve.sh ``` + **(optional)** Configure by changing the files in `www/json`. Defaults are in `www/json/*.sample` @@ -50,15 +46,16 @@ cp ..... www/json/connectionConfig.json ``` ### Activation (after install, and in every new shell) + ``` source setup/activate_serve.sh ``` ### Running -Start the phonegap deployment server and note the URL(s) that the server is listening to. +1. Start the phonegap deployment server and note the URL(s) that the server is listening to. - + ``` npm run serve .... [phonegap] listening on 10.0.0.14:3000 @@ -67,11 +64,12 @@ Start the phonegap deployment server and note the URL(s) that the server is list [phonegap] ctrl-c to stop the server [phonegap] .... + ``` -Change the devapp connection URL to one of these (e.g. 192.168.162.1:3000) and press "Connect" -The app will now display the version of e-mission app that is in your local directory -The console logs will be displayed back in the server window (prefaced by `[console]`) -Breakpoints can be added by connecting through the browser +1. Change the devapp connection URL to one of these (e.g. 192.168.162.1:3000) and press "Connect" +1. The app will now display the version of e-mission app that is in your local directory + 1. The console logs will be displayed back in the server window (prefaced by `[console]`) + 1. Breakpoints can be added by connecting through the browser - Safari ([enable develop menu](https://support.apple.com/guide/safari/use-the-safari-develop-menu-sfri20948/mac)): Develop -> Simulator -> index.html - Chrome: chrome://inspect -> Remote target (emulator) @@ -79,9 +77,9 @@ Breakpoints can be added by connecting through the browser **Note1**: You may need to scroll up, past all the warnings about `Content Security Policy has been added` to find the port that the server is listening to. -## End to End Testing - -A lot of the visualizations that we display in the phone client come from the server. In order to do end-to-end testing, we need to run a local server and connect to it. Instructions for: +End to end testing +--- +A lot of the visualizations that we display in the phone client come from the server. In order to do end to end testing, we need to run a local server and connect to it. Instructions for: 1. installing a local server, 2. running it, @@ -90,51 +88,25 @@ A lot of the visualizations that we display in the phone client come from the se are available in the [e-mission-server README](https://github.com/e-mission/e-mission-server/blob/master/README.md). -In order to make end-to-end testing even easier, we have moved from phone app to a dynamic config setting. We use the dynamic config to specify the server locations. Refer [Doc](https://github.com/e-mission/nrel-openpath-deploy-configs) - -If you have the [e-mission-server](https://github.com/e-mission/e-mission-server) running at a specific URL or IP address, and you want to connect to it, you would have to specify that URL or IP in the `server` field of your dynamic config file. +In order to make end to end testing easy, if the local server is started on a HTTP (versus HTTPS port), it is in development mode. By default, the phone app connects to the local server (localhost on iOS, [10.0.2.2 on android](https://stackoverflow.com/questions/5806220/how-to-connect-to-my-http-localhost-web-server-from-android-emulator-in-eclips)) with the `prompted-auth` authentication method. To connect to a different server, or to use a different authentication method, you need to create a `www/json/connectionConfig.json` file. More details on configuring authentication [can be found in the docs](https://github.com/e-mission/e-mission-docs/blob/master/docs/install/configuring_authentication.md). One advantage of using `skip` authentication in development mode is that any user email can be entered without a password. Developers can use one of the emails that they loaded test data for in step (3) above. So if the test data loaded was with `-u shankari@eecs.berkeley.edu`, then the login email for the phone app would also be `shankari@eecs.berkeley.edu`. -## Updating the e-mission-\* plugins or adding new plugins - +Updating the e-mission-\* plugins or adding new plugins +--- [![osx-build-ios](https://github.com/e-mission/e-mission-phone/actions/workflows/ios-build.yml/badge.svg)](https://github.com/e-mission/e-mission-phone/actions/workflows/ios-build.yml) [![osx-build-android](https://github.com/e-mission/e-mission-phone/actions/workflows/android-build.yml/badge.svg)](https://github.com/e-mission/e-mission-phone/actions/workflows/android-build.yml) +[![osx-android-prereq-sdk-install](https://github.com/e-mission/e-mission-phone/actions/workflows/android-automated-sdk-install.yml/badge.svg)](https://github.com/e-mission/e-mission-phone/actions/workflows/android-automated-sdk-install.yml) Pre-requisites --- -- The version of xcode used by the CI. +- the version of xcode used by the CI - to install a particular version, use [xcode-select](https://www.unix.com/man-page/OSX/1/xcode-select/) - or this [supposedly easier to use repo](https://github.com/xcpretty/xcode-install) + - **NOTE**: the basic xcode install on Catalina was messed up for me due to a prior installation of command line tools. [These workarounds helped](https://github.com/nodejs/node-gyp/blob/master/macOS_Catalina.md). - git -- Java 17. Tested with [OpenJDK 17 (Temurin) using AdoptOpenJDK](https://adoptium.net). -- Always use [homebrew](https://brew.sh) in addition to CLI - - this allows us to install the current version of cocoapods without - running into ruby incompatibilities - e.g. - https://github.com/CocoaPods/CocoaPods/issues/11763 - -:triangular_flag_on_post: __Important__ - -Most of the recent issues encountered have been due to incompatible setup. We -have now: -- locked down the dependencies, -- created setup and teardown scripts to setup self-contained environments with - those dependencies, and -- CI enabled to validate that they continue work. - -If you have setup failures, please compare the configuration in the **passing CI -builds** with your configuration. That is almost certainly the source of the error. - -__Export statements__ -``` -export ANDROID_SDK_ROOT="/Users//Library/Android/sdk" -``` -``` -export ANDROID_HOME="/Users//Library/Android/sdk" -``` -aka the path where you want the SDK to be installed. - -- android SDK; install manually or use setup script below (**recommended**). Note that you only need to run this once **per computer**. +- Java 17. Tested with [OpenJDK 17 (Temurin) using Adoptium](https://adoptium.net). +- android SDK; install manually or use setup script below. Note that you only need to run this once **per computer**. ``` bash setup/prereq_android_sdk_install.sh ``` @@ -159,11 +131,26 @@ aka the path where you want the SDK to be installed. ``` +- if you are not on the most recent version of OSX, `homebrew` + - this allows us to install the current version of cocoapods without + running into ruby incompatibilities - e.g. + https://github.com/CocoaPods/CocoaPods/issues/11763 +Important +--- +Most of the recent issues encountered have been due to incompatible setup. We +have now: +- locked down the dependencies, +- created setup and teardown scripts to setup self-contained environments with + those dependencies, and +- CI enabled to validate that they continue work. -__Installing (one time only)__ +If you have setup failures, please compare the configuration in the passing CI +builds with your configuration. That is almost certainly the source of the error. -- Run the setup script for the platform you want to build +Installing (one time only) +--- +Run the setup script for the platform you want to build ``` bash setup/setup_android_native.sh @@ -182,18 +169,12 @@ cp www/json/startupConfig.json.sample www/json/startupConfig.json cp ..... www/json/connectionConfig.json ``` -If connecting to a development server over http, make sure to turn on http support on android - -``` - - - -``` -__Run this in every new shell for Activation__ +### Activation (after install, and in every new shell) ``` source setup/activate_native.sh ``` +
Expected Output ``` @@ -210,20 +191,30 @@ Copied config.cordovabuild.xml -> config.xml and package.cordovabuild.json -> pa ```
-
- __Pick a type of build and execute the following:__ -More "versions" are available in [`package.cordovabuild.json`](package.cordovabuild.json) +### Activation (after install, and in every new shell) + +If connecting to a development server over http, make sure to turn on http support on android + ``` -npm run + + + ``` -For instance: (build-dev-android) +### Run in the emulator + ``` -npm run build-dev-android +npm run ``` -
Your expected output should look something like this +AND/OR +``` +npm run +``` +for builds, refer [`package.cordovabuild.json`](package.cordovabuild.json) + +
Expected output ``` BUILD SUCCESSFUL in 2m 48s @@ -234,10 +225,8 @@ Built the following apk(s):
-
- -## Creating logos - +Creating logos +--- If you are building your own version of the app, you must have your own logo to avoid app store conficts. Updating the logo is very simple using the [`ionic cordova resources`](https://ionicframework.com/docs/v3/cli/cordova/resources/) @@ -245,7 +234,21 @@ command. **Note**: You may have to install the [`cordova-res` package](https://github.com/ionic-team/cordova-res) for the command to work -## Beta-testing debugging + +Troubleshooting +--- +- Make sure to use `npx ionic` and `npx cordova`. This is + because the setup script installs all the modules locally in a self-contained + environment using `npm install` and not `npm install -g` +- Check the CI to see whether there is a known issue +- Run the commands from the script one by one and see which fails + - compare the failed command with the CI logs +- Another workaround is to delete the local environment and recreate it + - javascript errors: `rm -rf node_modules && npm install` + - native code compile errors: `rm -rf plugins && rm -rf platforms && npx cordova prepare` + +Beta-testing debugging +--- If users run into problems, they have the ability to email logs to the maintainer. These logs are in the form of an sqlite3 database, so they have to be opened using `sqlite3`. Alternatively, you can export it to a csv with @@ -253,38 +256,37 @@ dates using the `bin/csv_export_add_date.py` script. ``` -mv ~/Downloads/loggerDB /tmp/logger. -pwd +$ mv ~/Downloads/loggerDB /tmp/logger. +$ pwd .../e-mission-phone -python bin/csv_export_add_date.py /tmp/loggerDB. -less /tmp/loggerDB..withdate.log +$ python bin/csv_export_add_date.py /tmp/loggerDB. +$ less /tmp/loggerDB..withdate.log ``` -## Contributing +Contributing +--- -:point_right:Add the main repo as upstream -``` -git remote add upstream https://github.com/e-mission/e-mission-phone -``` -:point_right:Create a new branch (IMPORTANT). Please do not submit pull requests from master -``` -git checkout -b -``` -:point_right:Make changes to the branch and commit them -``` -git commit -``` -:point_right:Push the changes to your local fork -``` -git push origin -``` -:point_right:Generate a pull request from the UI +Add the main repo as upstream + + git remote add upstream https://github.com/e-mission/e-mission-phone.git + +Create a new branch (IMPORTANT). Please do not submit pull requests from master + + git checkout -b mybranch -
+Make changes to the branch and commit them -__\*__Address my review comments__\*__ + git commit -Once I merge the pull request :smiley: :tada:, pull the changes to your fork and delete the branch +Push the changes to your local fork + + git push origin mybranch + +Generate a pull request from the UI + +Address my review comments + +Once I merge the pull request, pull the changes to your fork and delete the branch ``` git checkout master ``` @@ -297,27 +299,3 @@ git push origin master ``` git branch -d ``` - ---- -### Troubleshooting -:point_right:Xcode command line tools -``` -Warning: No developer tools installed. -You should install the Command Line Tools. -``` -``` -xcode-select --install -``` - -:point_right:Creating Logos -- Make sure to use `npx ionic` and `npx cordova`. This is - because the setup script installs all the modules locally in a self-contained - environment using `npm install` and not `npm install -g` -- Check the CI to see whether there is a known issue -- Run the commands from the script one by one and see which fails - - compare the failed command with the CI logs -- Another workaround is to delete the local environment and recreate it - - javascript errors: `rm -rf node_modules && npm install` - - native code compile errors: `rm -rf plugins && rm -rf platforms && npx cordova prepare` - -(For updating the e-mission-plugins or adding new plugins) **NOTE**: the basic xcode install on Mac OS Catalina was messed up for me due to a prior installation of command line tools. [These workarounds helped](https://github.com/nodejs/node-gyp/blob/master/macOS_Catalina.md). From b6e3c65f74fa31f6dc7e0c2d9044875da82db8e7 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Tue, 17 Oct 2023 10:42:13 -0600 Subject: [PATCH 22/34] Update README.md Adding suggested changes Co-authored-by: shankari --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7fca214aa..6fdf01891 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This is the phone component of the e-mission system. :sparkles: This has been upgraded to the latest **Android**, **iOS**, **cordova-lib**, **node** and **npm** versions. __This is ready to build out of the box.__ -For the latest versions, refer [`package.cordovabuild.json`](package.cordovabuild.json) +The currently supported versions are in [`package.cordovabuild.json`](package.cordovabuild.json) Additional Documentation --- From 2b5735e411a514e0e5aa1aa74dadf2902ee6cc38 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Tue, 17 Oct 2023 10:43:10 -0600 Subject: [PATCH 23/34] Update README.md Committing suggested changes Co-authored-by: Jack Greenlee --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6fdf01891..9db9d3798 100644 --- a/README.md +++ b/README.md @@ -212,7 +212,7 @@ AND/OR ``` npm run ``` -for builds, refer [`package.cordovabuild.json`](package.cordovabuild.json) +For other options of build scripts, refer to [`package.cordovabuild.json`](package.cordovabuild.json)
Expected output From cb954d1604a34cbc897992835539ebaaecc2bdd2 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Tue, 17 Oct 2023 10:54:17 -0600 Subject: [PATCH 24/34] Update README.md Committing changes based on suggestions - Wording - Listing common build types --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 9db9d3798..59f725934 100644 --- a/README.md +++ b/README.md @@ -213,6 +213,12 @@ AND/OR npm run ``` For other options of build scripts, refer to [`package.cordovabuild.json`](package.cordovabuild.json) +Common ones listed below (both, Android, iOS) +``` +npm run build +npm run build-prod-android +npm run build-prod-ios +```
Expected output From 46439496147ce1dac70a4c82bbe7615f5357fce6 Mon Sep 17 00:00:00 2001 From: Jack Greenlee Date: Wed, 18 Oct 2023 00:18:41 -0400 Subject: [PATCH 25/34] Apply suggestions from code review --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 59f725934..28f6fe615 100644 --- a/README.md +++ b/README.md @@ -203,7 +203,7 @@ If connecting to a development server over http, make sure to turn on http suppo ``` -### Run in the emulator +### Building the app ``` npm run From 685e1b65b718f04f224945514ade63c43743da0e Mon Sep 17 00:00:00 2001 From: Jack Greenlee Date: Wed, 18 Oct 2023 00:33:28 -0400 Subject: [PATCH 26/34] Update README.md Reword the "Building the app" section to make it clearer what scripts are available and what they do --- README.md | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 28f6fe615..9e3b865c0 100644 --- a/README.md +++ b/README.md @@ -205,22 +205,17 @@ If connecting to a development server over http, make sure to turn on http suppo ### Building the app -``` -npm run -``` -AND/OR -``` -npm run -``` -For other options of build scripts, refer to [`package.cordovabuild.json`](package.cordovabuild.json) -Common ones listed below (both, Android, iOS) -``` -npm run build -npm run build-prod-android -npm run build-prod-ios -``` +We offer a set of build scripts you can pick from, each of which i) bundle the JS with Webpack and then ii) proceed with a Cordova build. +You can bundle JS in 'production' or 'dev' mode, and you can build Android or iOS or both. +The common use cases will be: + +- `npm run build` (to build for production on both Android and iOS platforms) +- `npm run build-prod-android` (to build for production on Android platform only) +- `npm run build-prod-ios` (to build for production on iOS platform only) + +Find the full list of these scripts in [`package.cordovabuild.json`](package.cordovabuild.json) -
Expected output +
Expected output (Android build) ``` BUILD SUCCESSFUL in 2m 48s From 047c2b72150bcd373f08100b569376ca82a3efca Mon Sep 17 00:00:00 2001 From: Jack Greenlee Date: Wed, 18 Oct 2023 00:38:52 -0400 Subject: [PATCH 27/34] Update README.md Remove the note about putting your own configuration files in the `/json` directory. We use the dynamic config now and encourage people to use it rather than making local code changes. --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index 9e3b865c0..28d2940df 100644 --- a/README.md +++ b/README.md @@ -36,15 +36,6 @@ Run the setup script bash setup/setup_serve.sh ``` -**(optional)** Configure by changing the files in `www/json`. -Defaults are in `www/json/*.sample` - -``` -ls www/json/*.sample -cp www/json/startupConfig.json.sample www/json/startupConfig.json -cp ..... www/json/connectionConfig.json -``` - ### Activation (after install, and in every new shell) ``` From 5f9d189fb6e1723587aa2907dc1f8b9fffd5e51a Mon Sep 17 00:00:00 2001 From: Jack Greenlee Date: Wed, 18 Oct 2023 00:59:57 -0400 Subject: [PATCH 28/34] Update README.md update outdated comments about connectionConfig.json to reflect that we don't use connectionConfig.json anymore; this is replaced by the 'server' field of the dynamic config. If not present, it uses localhost. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 28d2940df..f15d413c5 100644 --- a/README.md +++ b/README.md @@ -79,9 +79,9 @@ A lot of the visualizations that we display in the phone client come from the se are available in the [e-mission-server README](https://github.com/e-mission/e-mission-server/blob/master/README.md). -In order to make end to end testing easy, if the local server is started on a HTTP (versus HTTPS port), it is in development mode. By default, the phone app connects to the local server (localhost on iOS, [10.0.2.2 on android](https://stackoverflow.com/questions/5806220/how-to-connect-to-my-http-localhost-web-server-from-android-emulator-in-eclips)) with the `prompted-auth` authentication method. To connect to a different server, or to use a different authentication method, you need to create a `www/json/connectionConfig.json` file. More details on configuring authentication [can be found in the docs](https://github.com/e-mission/e-mission-docs/blob/master/docs/install/configuring_authentication.md). +The dynamic config (see https://github.com/e-mission/nrel-openpath-deploy-configs) controls the server endpoint that the phone app will connect to. If you are running the app in an emulator on the same machine as your local server (i.e. they share a `localhost`), you can use one of the `dev-emulator-*` configs (these configs have no `server` specified so `localhost` is assumed). -One advantage of using `skip` authentication in development mode is that any user email can be entered without a password. Developers can use one of the emails that they loaded test data for in step (3) above. So if the test data loaded was with `-u shankari@eecs.berkeley.edu`, then the login email for the phone app would also be `shankari@eecs.berkeley.edu`. +If you wish to connect to a different server, create your own config file according to https://github.com/e-mission/nrel-openpath-deploy-configs and specify the `server` field accordingly. Updating the e-mission-\* plugins or adding new plugins --- From c6dc2e5ab2bceb4081835383d537861714648860 Mon Sep 17 00:00:00 2001 From: Jack Greenlee Date: Wed, 18 Oct 2023 01:04:57 -0400 Subject: [PATCH 29/34] Update README.md reword "Building the app" --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f15d413c5..1282b2c6e 100644 --- a/README.md +++ b/README.md @@ -196,14 +196,14 @@ If connecting to a development server over http, make sure to turn on http suppo ### Building the app -We offer a set of build scripts you can pick from, each of which i) bundle the JS with Webpack and then ii) proceed with a Cordova build. -You can bundle JS in 'production' or 'dev' mode, and you can build Android or iOS or both. +We offer a set of build scripts to pick from, each of which: (i) bundle the JS with Webpack, and then (ii) proceed with a Cordova build. The common use cases will be: - `npm run build` (to build for production on both Android and iOS platforms) - `npm run build-prod-android` (to build for production on Android platform only) - `npm run build-prod-ios` (to build for production on iOS platform only) +There are a variety of options because Webpack can bundle the JS in 'production' or 'dev' mode, and you can build Android or iOS or both. Find the full list of these scripts in [`package.cordovabuild.json`](package.cordovabuild.json)
Expected output (Android build) From 96d29e6c887489381e910cad8441df3791a798b8 Mon Sep 17 00:00:00 2001 From: Jack Greenlee Date: Wed, 18 Oct 2023 01:15:50 -0400 Subject: [PATCH 30/34] Update README.md make "Updating the UI only" a bit clearer: - you don't have to manually type the IP address in the devapp if it's on localhost - you do have to type it manually if it's on a different device, and you should make sure that it's on the same network --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1282b2c6e..0f2b4642e 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,9 @@ source setup/activate_serve.sh .... ``` -1. Change the devapp connection URL to one of these (e.g. 192.168.162.1:3000) and press "Connect" +1. Change the devapp connection URL and press "Connect" + - If you are running the devapp in an emulator on the same machine as the devapp server, you may simply use localhost, which would be `127.0.0.1:3000` on iOS and `10.0.2.2:3000` on Android. + - If you are running the devapp on a different device, you must type the address manually (e.g. `192.168.162.1:3000`). Note that this is a local IP address; the devices must be on the same network 1. The app will now display the version of e-mission app that is in your local directory 1. The console logs will be displayed back in the server window (prefaced by `[console]`) 1. Breakpoints can be added by connecting through the browser @@ -66,7 +68,7 @@ source setup/activate_serve.sh **Ta-da!** :gift: If you change any of the files in the `www` directory, the app will automatically be re-loaded without manually restarting either the server or the app :tada: -**Note1**: You may need to scroll up, past all the warnings about `Content Security Policy has been added` to find the port that the server is listening to. +**Note**: You may need to scroll up, past all the warnings about `Content Security Policy has been added` to find the port that the server is listening to. End to end testing --- From 079f4ea667a876b06a23475f52041d78c58ffe4f Mon Sep 17 00:00:00 2001 From: Jack Greenlee Date: Wed, 18 Oct 2023 01:22:00 -0400 Subject: [PATCH 31/34] Update README.md Remove the note about putting your own configuration files in the `/json` directory. We use the dynamic config now and encourage people to use it rather than making local code changes. --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index 0f2b4642e..3c5a12e8c 100644 --- a/README.md +++ b/README.md @@ -153,15 +153,6 @@ AND/OR bash setup/setup_ios_native.sh ``` -**(optional)** Configure by changing the files in `www/json`. -Defaults are in `www/json/*.sample` - -``` -ls www/json/*.sample -cp www/json/startupConfig.json.sample www/json/startupConfig.json -cp ..... www/json/connectionConfig.json -``` - ### Activation (after install, and in every new shell) ``` From 58a50a6b941204a93e344305c32cd153d00afe6c Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Thu, 19 Oct 2023 12:05:19 -0600 Subject: [PATCH 32/34] Update README.md Committing suggested change Co-authored-by: K. Shankari --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3c5a12e8c..609777cc5 100644 --- a/README.md +++ b/README.md @@ -177,7 +177,7 @@ Copied config.cordovabuild.xml -> config.xml and package.cordovabuild.json -> pa
-### Activation (after install, and in every new shell) +### Enable HTTP support on android by editing `config.xml` If connecting to a development server over http, make sure to turn on http support on android From 9d3965a1f9607837cc6989cebfdfdad8eaf28743 Mon Sep 17 00:00:00 2001 From: Nitish Ramakrishnan <69108657+niccolopaganini@users.noreply.github.com> Date: Thu, 19 Oct 2023 12:11:56 -0600 Subject: [PATCH 33/34] Update README.md Committing change based on suggestion (adding a link that points to Noel-openpath-deploy-configs) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 609777cc5..111e0d82a 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ are available in the [e-mission-server README](https://github.com/e-mission/e-mi The dynamic config (see https://github.com/e-mission/nrel-openpath-deploy-configs) controls the server endpoint that the phone app will connect to. If you are running the app in an emulator on the same machine as your local server (i.e. they share a `localhost`), you can use one of the `dev-emulator-*` configs (these configs have no `server` specified so `localhost` is assumed). -If you wish to connect to a different server, create your own config file according to https://github.com/e-mission/nrel-openpath-deploy-configs and specify the `server` field accordingly. +If you wish to connect to a different server, create your own config file according to https://github.com/e-mission/nrel-openpath-deploy-configs and specify the `server` field accordingly. [deploy-configs](https://github.com/e-mission/nrel-openpath-deploy-configs/#testing-configs) has more information on this. Updating the e-mission-\* plugins or adding new plugins --- From ca0d569db01f2b7fdd825423fe4f212938494384 Mon Sep 17 00:00:00 2001 From: "K. Shankari" Date: Thu, 19 Oct 2023 13:00:14 -0700 Subject: [PATCH 34/34] clarify link to repo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 111e0d82a..121684e0a 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ are available in the [e-mission-server README](https://github.com/e-mission/e-mi The dynamic config (see https://github.com/e-mission/nrel-openpath-deploy-configs) controls the server endpoint that the phone app will connect to. If you are running the app in an emulator on the same machine as your local server (i.e. they share a `localhost`), you can use one of the `dev-emulator-*` configs (these configs have no `server` specified so `localhost` is assumed). -If you wish to connect to a different server, create your own config file according to https://github.com/e-mission/nrel-openpath-deploy-configs and specify the `server` field accordingly. [deploy-configs](https://github.com/e-mission/nrel-openpath-deploy-configs/#testing-configs) has more information on this. +If you wish to connect to a different server, create your own config file according to https://github.com/e-mission/nrel-openpath-deploy-configs and specify the `server` field accordingly. The [deploy-configs](https://github.com/e-mission/nrel-openpath-deploy-configs/#testing-configs) repo has more information on this. Updating the e-mission-\* plugins or adding new plugins ---