The frontend (phone) code for the e-mission server

Overview

e-mission phone app

This is the phone component of the e-mission system.

This has now been upgraded to cordova [email protected] and [email protected] (details). It has also been upgraded to android API 29, [email protected] and the most recent node and npm versionsIt also now supports CI, so we should not have any build issues in the future. The limitations from the previous upgrade have all been resolved. This should be ready to build out of the box, after all the configuration files are changed.

Additional Documentation

Additional documentation has been moved to its own repository 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. If you have a question, as suggested by the open source guide, 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

osx-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.

Installing (one-time)

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)

$ source setup/activate_serve.sh

Running

  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
    [phonegap] listening on 192.168.162.1:3000
    [phonegap]
    [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 - Safari (enable develop menu): Develop -> Simulator -> index.html - Chrome: chrome://inspect -> Remote target (emulator)

Ta-da! 🎁 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 🎉

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.

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) 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.

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 [email protected], then the login email for the phone app would also be [email protected].

Updating the e-mission-* plugins or adding new plugins

osx-build-ios osx-ubuntu-build-android

Pre-requisites

  • the version of xcode used by the CI
  • git
  • the most recent version of android studio
    • NOTE: although Catalina has a /usr/bin/java, trying to run it gives the error No Java runtime present, requesting install.. The build now requires Java 11. Installed OpenJDK 11 (Temurin) using AdoptOpenJDK to be consistent with the CI.

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

$ bash setup/setup_android_native.sh
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)

$ source setup/activate_native.sh

Run in the emulator

$ npx cordova emulate ios
AND/OR
$ npx cordova emulate 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 command.

Note: You may have to install the cordova-res package for the command to work

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 dates using the bin/csv_export_add_date.py script.

<download the log file>
$ mv ~/Downloads/loggerDB /tmp/logger.<issue>
$ pwd
.../e-mission-phone
$ python bin/csv_export_add_date.py /tmp/loggerDB.<issue>
$ less /tmp/loggerDB.<issue>.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

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

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
Comments
  • Merge the mode and purpose final code

    Merge the mode and purpose final code

    This fixes https://github.com/e-mission/e-mission-docs/issues/353

    • Put the notification code into separate tripconfirmmodules; there are two potential prompts and they can be configured in any combination
    • Merge the buttons into the list view (list view now has support for both incidents and trip confirmation)
    • switch the default prompt to tripconfirm
    • change the post-trip prompt to be more meaningful
    opened by shankari 48
  • Unified diary screen

    Unified diary screen

    Changes Include:

    • Design layout of Unified Diary Screen --- CSS color schematics, font styles
    • Inline map from diary screen
    • converting trip to tripgj for map in the trip item directive
    • removing Diary tab from ion-tab in the bottom
    • Date Line - Breaks: displaying the date in between trips in the infinite scroll

    Still working on implementing the date selector.

    Issues:

    • Tripgj percentages: the DiaryHelper.getPercentages does not work in converting trip to tripgj in the trip item directive. The trip does not have an attribute "sections", and looking into the services.js led me down a rabbit hole of trying to implement different functions from the Diary Helper. If one function needed an attribute, I went to the DH to see if I could add that to the trip, and then to do so that function required a different attribute. To add that attribute, the process repeated, so I am shelving the percentages for later.
    opened by tyleryandt18 42
  • Implement initial integration with enketo-core to display complex emb…

    Implement initial integration with enketo-core to display complex emb…

    …edded surveys

    The form is displayed inline in the main app, so it can be manipulated much more easily. In particular:

    • both the form and the model are javascript objects passed in to a function so can be manipulated at will to customize the survey for a particular user.
    • The result is also retrieved in the form, so results can be reflected immediately in the UX

    The form is currently displayed as a view in the metrics tab, with its own state. I considered making it a popover instead, but wasn't sure that the smaller width would work for the survey. I might experiment with that in a future change.

    The main changes to the app itself are to the main.js to define the new state, and a new survey launcher enketo_launch.js that is the controller for the new state.

    The rest of the code is to check in the enketo javascript libraries. It is theoretically possible to install them via npm install and then use rollup or webpack to create the bundle. But we don't really have a gruntfile or other build mechanism to invoke the rollup/webpack, and ES6 imports don't necessarily play nice with angular 1. For example, when I tried using import { Form } fromenketo-core`, angular complained about the import.

    Also, the resulting bundle file did not include an export for Form since rollup inlines functions where possible. I had to manually add window.FormModule to the javascript file to allow it to be used from the rest of the app.

    Given all this, I decided to check in enketo-core as a manual_lib.

    This change can be tested by applying the following patch, although it is pretty kludgy. Long-term, individual projects need to determine where they want to launch the test from.

    Also includes a couple of sample JSON files for testing.

    The input to the library is the enketo paper formatted JSON files.

    They can be obtained using the following process:

    • Create the form using kobotoolbox https://github.com/kobotoolbox/ or https://build.opendatakit.org/ This will let you download an xlsform
    • Convert xlsform -> xml form using http://xlsform.opendatakit.org/
    • Convert xml form -> enketo paper format form + model using enketo-transformer. The curl option works fine - I used it with requests
    • Copy the json files into www/json
    • Launch them by passing the JSON file as a parameter while changing state, as in metrics.js below
    diff --git a/www/js/metrics.js b/www/js/metrics.js
    index d80e81d7..e7e4a3d3 100644
    --- a/www/js/metrics.js
    +++ b/www/js/metrics.js
    @@ -35,6 +35,13 @@ angular.module('emission.main.metrics',['nvd3', 'emission.services', 'ionic-date
             $scope.onCurrentTrip();
         });
    
    +  $scope.testSurvey = function() {
    +    $state.go("root.main.enketosurvey", {
    +        form_location: "json/enketo-survey-sample-full.json"
    +    });
    +  }
    +
    +
         // If we want to share this function (see the pun?) between the control screen and the dashboard, we need to put it into a service/factory.
         // But it is not clear to me why it needs to be in the profile screen...
         var prepopulateMessage = {
    diff --git a/www/templates/main-metrics.html b/www/templates/main-metrics.html
    index 124e95d9..923e0d05 100644
    --- a/www/templates/main-metrics.html
    +++ b/www/templates/main-metrics.html
    @@ -10,6 +10,9 @@
           <button class="button button-icon" ng-click="doRefresh()">
             <i class="icon ion-refresh"></i>
           </button>
    +      <button class="button button-icon" ng-click="testSurvey()">
    +        TEST SURVEY
    +      </button>
       </ion-nav-buttons>
       <ion-content class="has-header">
         <div style="height: 40px; width: 100%; padding: 10px;" ng-if="uictrl.showVis"> <!-- visualization control -->
    
    opened by shankari 36
  • post-trip-prompt launch survey

    post-trip-prompt launch survey

    I am trying to get the post-trip-prompt to launch the survey.

    At this stage, I am not certain how should I get

    1. trip.data.properties.start_ts
    2. trip.data.properties.start_ts

    perhaps you can help what is inside notification.data and data variable.

    opened by atton16 34
  • Rciti4

    Rciti4

    • Display "Trip not valid" when user reported it.
    • Fix label does not update after user answered the survey.
    • Add EnketoSurvey.getAllLocalSurveyAnswers function to support the fix mentioned above.

    Demo (GIF): Untitled2

    opened by atton16 28
  • User Profile Survey

    User Profile Survey

    In this PR,

    we are trying to put use survey for user profile purpose.

    So we are,

    1. Putting 'My Profile' button in survey tab
    2. Insert user profile survey during the on-boarding process
    opened by atton16 19
  • Add tram and subway

    Add tram and subway

    This PR contains the UI changes linked to https://github.com/e-mission/e-mission-server/pull/709. I didn't find the footprint of both subway and tram (or at least I don't know where to find them).

    opened by DO3B 18
  • Update carbon calculations for GIS server (richer modes)

    Update carbon calculations for GIS server (richer modes)

    Update the carbon calculations so that they use the richer modes in the GIS-based server (ground_truth_matching branch).

    • Aggregate (average) data won't work properly on local servers, due to an outstanding issue.
    • In fillFootprintAggVals it can happen that that the mode ON_FOOT has a NaN value; a workaround was provided for that, but the source of the problem should be investigated (perhaps it is due to different modes in app VS server?)
    opened by tms-martins 17
  • Mode/Purpose Confirm Survey

    Mode/Purpose Confirm Survey

    In this PR we are trying to implement:

    1. Survey display for Mode & Purpose confirmation
    2. Survey display with previous answer restoration (if any)
    3. Dynamic button label display based on previously answered survey on both Mode Button and Purpose Button

    At this point, I am struggle at Point (2). It appears that somehow $window.cordova.plugins.BEMUserCache.getAllMessages complicate things up.

    If you look at the code in the file js/survey/enketo-survey-services.js line 55-64 never get executes.

    Here is the output:

    [phonegap] [console.log] EnketoSurvey.init()
    [phonegap] [console.log] try to restore answer
    [phonegap] [console.log] DEBUG:Answers stored locally[{"trip_properties":{"end_ts":1437582214.517,"start_ts":1437578093.881},"data":"<trip-end-survey_v5 xmlns:jr=\"http://openrosa.org/javarosa\" xmlns:odk=\"http://www.opendatakit.org/xforms\" xmlns:orx=\"http://openrosa.org/xforms\" id=\"trip-end-survey_v5\" version=\"veMfY6eZ2W9qoGhmfzJX8F\"><start>2019-05-23T17:19:43.089+07:00</start><end>2019-05-23T17:19:43.098+07:00</end><group_vs9ga59><trip_purpose_main>1</trip_purpose_main><trip_purpose_sub_category/></group_vs9ga59><group_ee9rk21><travel_mode_main>walk</travel_mode_main><travel_mode_sub_category/><Total_people_in_trip_party>1</Total_people_in_trip_party><Non_household_member_s_on_trip>0</Non_household_member_s_on_trip><Household_member_s_on_trip>1</Household_member_s_on_trip><group_bn3jd79><Vehicle_trip_with_2_Driver_or_passenger/><Vehicle_trip_Parking_location/><Parking_cost/></group_bn3jd79><Rail_payment_method/><Transit_fees_AUD/><Taxi_fees/></group_ee9rk21><__version__>vLX8oPb8xP2pLvxNBagygU</__version__><_version_>vwpCadzPYVsW9XEjxZzwnR</_version_><_version__001>vSuFDQ2DcmpRpKcRfSXReq</_version__001><_version__002>veMfY6eZ2W9qoGhmfzJX8F</_version__002><meta><instanceID>uuid:69bb39ae-6420-471a-afe0-3012e4de23c8</instanceID></meta></trip-end-survey_v5>"}]
    [phonegap] [console.log] DEBUG:[object Object]
    [phonegap] [console.log] DEBUG:[object Object]
    [phonegap] [console.log] DEBUG:found
    [phonegap] [console.log] DEBUG:false
    

    At first the problem was worse, when the code was combined in the EnketoSurveyCtrl controller (now resides in the file js/survey/enketo-survey.js) the button in the corresponding template cannot call validateForm function. So my assumption is that $scope get lost in the process of executing $window.cordova.plugins.BEMUserCache.getAllMessages. Now that I have separate the controller and service, I am stuck with the same bizarre problem where some code gets lost and never fired up.

    opened by atton16 17
  • Select carbon dataset via settings menu

    Select carbon dataset via settings menu

    The user can select which carbon-footprint dataset is used in carbon footprint calculations, via the settings menu. A service was created to handle storing of the user's choice and provide the data for the selected dataset. Datasets are hard-coded and include the US dataset (previously in the app and used by default) as well as Germany, France, Austria, Sweden, Norway and Switzerland; and an EU dataset based on the values from these countries. Sources: Tremod and HBEFA.

    opened by tms-martins 16
  • Temp branch

    Temp branch

    Implemented: Pull to refresh Improved: font-size for list and detail view changed to "em" unit from "px". Text size is fine tested on iPhone 4s. (No 5c model available in simulator) To be done: Leaflet doesn't load correctly when the size is specified in percentage instead of real # of pixels so I still need to figure out how to achieve responsive resizing for map.

    screen shot 2016-06-21 at 12 33 16 am screen shot 2016-06-21 at 12 33 10 am

    opened by krisma 16
  • Time-Use tab (Sebastian)

    Time-Use tab (Sebastian)

    Got the basic time use tab working!

    Now that it is working at a basic level, Next steps are to make changes to the time use tab to get it working how we want it.

    A meeting is scheduled next Monday for this conversation with @asiripanich and @shankari


    Testing:

    Simulator Screen Shot - iPhone 11 - 2022-12-09 at 11 41 33

    opened by sebastianbarry 47
  • Adding description for error 403

    Adding description for error 403

    If the error text is exactly as "During server call, error The operation couldn’t be completed. (com.google.HTTPStatus error 403.)", then the error is prepended with "Errr: OPcode not found."

    This was made specifically for the error checking in the following files:

    • services.js (reading confirmed trips)
    • metrics.js (Error loading user data)
    • storedevicesettings.js (Error in updating profile to store device settings)
    opened by sebastianbarry 1
  • Added very basic date picker button

    Added very basic date picker button

    infinite_scroll_list.js

    • Copied over functions from list.js, functions that relate to the date picker
    • Sets current day as the current time in UTC within the getDataFromServer function

    infinite_scroll_list.html

    • Added an ng-click for the pickDay() function when the user clicks on the date in the diary i.e. "----- Tue 27 Sep 22 -----"
    • Added a feedback for changing the date, for debugging purposes

    https://user-images.githubusercontent.com/61334340/192608871-b1d09a91-2593-4d97-9422-c48b9aadbf30.mov

    opened by sebastianbarry 4
  • Unified label screen

    Unified label screen

    This PR should include the commit history from SavoireFaire Linux. I cloned the Unified-Diary-Screen branch, pulled the savoire Dev branch, manually resolved the merge conflicts, and then lastly pulled my Unified-Diary-Screen branch changes onto it.

    opened by tyleryandt18 1
Releases(v3.2.4)
  • v3.2.4(May 30, 2022)

    This is a fix for the issue where the relative URL code on iOS doesn't work per documentation.

    • Relative URL doesn't work: e-mission/e-mission-docs#732 (comment)
    • Appending strings does work: e-mission/e-mission-docs#732 (comment)

    Includes fixes to:

    • connection settings to return a string instead of a URL https://github.com/e-mission/cordova-connection-settings/pull/22
    • server-communication and server-sync to concatenate directly using strings instead of using a relative URL https://github.com/e-mission/cordova-server-communication/pull/30 https://github.com/e-mission/cordova-server-sync/pull/52
    Source code(tar.gz)
    Source code(zip)
  • v3.2.3(May 5, 2022)

    We haven't had a release for a while, so let's tag this before starting the next round of changes. The high level changes are:

    • label assist
    • convert the user input into a directive
    • change the dashboard to support user labels instead of sensed values
    • create a status screen
    • finally fix the map issues

    What's Changed

    • Add UI features and algorithm to support label inference by @GabrielKS in https://github.com/e-mission/e-mission-phone/pull/762
    • Fix verifiability bug by @GabrielKS in https://github.com/e-mission/e-mission-phone/pull/763
    • Add "To Label" screen by @GabrielKS in https://github.com/e-mission/e-mission-phone/pull/765
    • wrap native calls in intro.js in a ready() statement by @shankari in https://github.com/e-mission/e-mission-phone/pull/773
    • Allow bower to be run as root by @shankari in https://github.com/e-mission/e-mission-phone/pull/776
    • Fix a dead link. by @asiripanich in https://github.com/e-mission/e-mission-phone/pull/777
    • Workaround the android tools upgrade to get CI to work again by @shankari in https://github.com/e-mission/e-mission-phone/pull/779
    • Get confidenceThreshold from config file by @GabrielKS in https://github.com/e-mission/e-mission-phone/pull/780
    • Incorporate Label UI changes from ceo_ebike_project_stage into master by @GabrielKS in https://github.com/e-mission/e-mission-phone/pull/794
    • Cherry-pick the walkthrough changes to master by @shankari in https://github.com/e-mission/e-mission-phone/pull/796
    • Ongoing PR to track the progress of modularizing and modernizing user input handling by @shankari in https://github.com/e-mission/e-mission-phone/pull/799
    • Minor fixes from ceo branch by @shankari in https://github.com/e-mission/e-mission-phone/pull/800
    • Other imports and fixes by @shankari in https://github.com/e-mission/e-mission-phone/pull/801
    • Ensure that stats are generated correctly by @shankari in https://github.com/e-mission/e-mission-phone/pull/802
    • Replace the help/walkthrough button with the resize icon by @shankari in https://github.com/e-mission/e-mission-phone/pull/803
    • First beta testing version by @shankari in https://github.com/e-mission/e-mission-phone/pull/804
    • Phone changes to handle user confirmed trips in the dashboard by @shankari in https://github.com/e-mission/e-mission-phone/pull/805
    • Handle the case where no trips have been labeled for two weeks by @shankari in https://github.com/e-mission/e-mission-phone/pull/806
    • Handle "other" modes without mappings in the JSON by @shankari in https://github.com/e-mission/e-mission-phone/pull/807
    • Fit and finish fixes to the dashboard screen by @shankari in https://github.com/e-mission/e-mission-phone/pull/808
    • Bump up the version numbers of the data collection and server sync pl… by @shankari in https://github.com/e-mission/e-mission-phone/pull/809
    • Finish pending changes for the status screen by @shankari in https://github.com/e-mission/e-mission-phone/pull/810
    • Refresh the status checks before the status modal is opened by @shankari in https://github.com/e-mission/e-mission-phone/pull/811
    • Create the iOS version of the status screen by @shankari in https://github.com/e-mission/e-mission-phone/pull/812
    • Address minor fit and finish fixes by @shankari in https://github.com/e-mission/e-mission-phone/pull/813
    • Remove most of the devDependencies from leaflet by @shankari in https://github.com/e-mission/e-mission-phone/pull/814
    • Fix "second level of end checks" for the user label matching by @shankari in https://github.com/e-mission/e-mission-phone/pull/815
    • Update the documentation to remove dependency on android studio by @shankari in https://github.com/e-mission/e-mission-phone/pull/816
    • Comment out everything else and just echo the initial environment var… by @shankari in https://github.com/e-mission/e-mission-phone/pull/817
    • Update the documentation to remove dependency on android studio by @shankari in https://github.com/e-mission/e-mission-phone/pull/818
    • Update packages and bump up version numbers by @shankari in https://github.com/e-mission/e-mission-phone/pull/819
    • Fix multiple map-related issues by @shankari in https://github.com/e-mission/e-mission-phone/pull/820
    • Minor fit and finish issues, primarily on iOS, but one for android by @shankari in https://github.com/e-mission/e-mission-phone/pull/821
    • Add additional logging + one more overlay hide by @shankari in https://github.com/e-mission/e-mission-phone/pull/822
    • Fix the weird issue where the map popup breaks maps in the diary list by @shankari in https://github.com/e-mission/e-mission-phone/pull/823
    • Bump up the version numbers to address the new map fixes by @shankari in https://github.com/e-mission/e-mission-phone/pull/824

    Full Changelog: https://github.com/e-mission/e-mission-phone/compare/v3.0.0...v3.2.3

    Source code(tar.gz)
    Source code(zip)
  • v3.0.0(Jun 6, 2021)

    • Open app settings on recent version of android (fixes https://github.com/e-mission/e-mission-docs/issues/608)
    • Open app settings on recent version of iOS (improves on https://github.com/e-mission/e-mission-docs/issues/483 by not relying only on documentation)
    • Refactor iOS onboarding to check for more conditions and handle them through popup redirects
    • Notification text improvements - making them more humanized and opening the door for i18n https://github.com/e-mission/e-mission-data-collection/pull/192 https://github.com/e-mission/e-mission-data-collection/pull/191 https://github.com/e-mission/e-mission-data-collection/pull/190

    Minor fixes to other plugins: null check and motion activity refactoring e-mission/cordova-jwt-auth#44 e-mission/cordova-server-sync#48

    Source code(tar.gz)
    Source code(zip)
  • v2.9.0(Oct 28, 2020)

    • Upgrade to API 29 on android and iOS 13 on iOS
    • Upgrade to [email protected] and [email protected]
    • Upgrade to the most recent version of all plugins
    • Improved robustness on both android and iOS (https://github.com/e-mission/e-mission-data-collection/releases/tag/v1.5.0)
    • Setup scripts to make it easy to build
    • Continuous integration using the setup scripts to test that everything continues to work
    • Multiple minor fixes, including:
      • adding a sensor explanation page
      • adding support for other survey pre-fill techniques, including Google Forms (pre-fill) and xpath
      • unify mode and purpose code and modularize the buttons for each trip to make it easier to collect other data
      • small fixes to the login screen, mainly ensuring that we won't get null and blank usernames
    Source code(tar.gz)
    Source code(zip)
  • v2.9.0-beta(Jul 11, 2020)

    This is a beta release since I am immediately planning an upgrade to [email protected] and [email protected]. If that takes too long or is too complex, we can promote this to a full release. But I am hoping it won't come to that.

    Source code(tar.gz)
    Source code(zip)
  • v2.9.0-before-upgrade(Jul 10, 2020)

    This has some issues with building, but they could be worked around. Tagging the state of the world before we upgrade in case we have to refer back to it at some point.

    Source code(tar.gz)
    Source code(zip)
  • v2.8.1(Apr 1, 2019)

  • v2.8.0(Mar 29, 2019)

  • v2.7.1(Oct 19, 2018)

    • Fix native versions of plugins (auth, deploy)
    • Migrate storage to avoid loss of data due to deletion of local storage
    • Remove the starting stop screen - studies should just use emTripLog instead
    Source code(tar.gz)
    Source code(zip)
  • v2.6.0(Feb 27, 2018)

  • v2.5.0(Feb 6, 2018)

    Switch from ionic cloud to ionic pro

    Simultaneously:

    • upgrade all plugins to their most recent versions
    • really switch away from crosswalk for L+ builds
    • handle android 8 location changes
    • startup fix for deleted local storage objects
    • remove the alpha channel on iOS icons

    This actually went through several rounds of upgrades, so the current published version is 2.5.3. But they were minor changes after 2.5.0.

    Source code(tar.gz)
    Source code(zip)
  • v2.3.0(Aug 16, 2017)

    The main change to this release is finally deploy the current screen. As a bonus, we also configure the server using a config json file instead of native code, making it easier to change.

    | Locally added incident | Incident reported by other and retrieved from server | |------------| --------------| | simulator screen shot aug 15 2017 10 06 53 pm | simulator screen shot aug 15 2017 11 12 59 pm |

    Source code(tar.gz)
    Source code(zip)
  • v2.2.0(Jun 9, 2017)

    Add support for muting/unmuting the end-of-trip notification.

    | Mute/snooze in notification | and in profile | |------------|----------| | simulator screen shot jun 9 2017 8 39 54 am | simulator screen shot jun 9 2017 8 38 09 am |

    Also add support to join/leave challenges and a challenge-specific leaderboard.

    | Leave/join challenges | and have the tasks show up | |------------|----------| | simulator screen shot jun 9 2017 7 57 33 am | simulator screen shot jun 9 2017 8 00 39 am |

    Source code(tar.gz)
    Source code(zip)
  • v2.1.0(Apr 28, 2017)

    Most of the heavy lifting here is in the native code (e.g. https://github.com/e-mission/cordova-jwt-auth/pull/13). javascript changes are relatively minor.

    • Hide the loading screen even if there are no trips
    • Add minor fixes to the referral code
    • Add cocoapods installation to the instructions (the new google auth library is installed using cocoapods)
    • Support automatic redirection based on local notifications
    Source code(tar.gz)
    Source code(zip)
  • v2.0.0(Apr 11, 2017)

    Display unprocessed trips in the diary. Most of the work was around converting the raw points into geojson and figuring out all the stupid edge cases. This requires significant re-work to make it pretty - dunno when I will ever have time to make it right.

    The good part is that this eventually does open up the opportunity to return raw timeseries objects instead of a per-day geojson object from the server.

    Screenshots are at https://github.com/e-mission/e-mission-phone/pull/215

    Source code(tar.gz)
    Source code(zip)
  • v1.9.0(Feb 27, 2017)

  • v1.8.1(Feb 12, 2017)

  • v1.8.0(Feb 7, 2017)

  • v1.7.0(Jan 24, 2017)

  • v1.6.0(Dec 1, 2016)

    This release adds support for adding incidents (safe/suck). Finally! Concretely, it:

    • adds a new factory to deal with incidents
    • allows users to add incidents by clicking on the trip details and selecting safe/suck
    • retrieves and displays unpushed incidents from the cache
    • retrieves pushed incidents as part of the trip geojson
    • displays user reported incidents in the diary
    • displays aggregate incidents in the heatmap, which now allows you to choose between counts and incidents
    Source code(tar.gz)
    Source code(zip)
    emission-armv7-build-20.apk(57.34 MB)
    emission-L.-build-20.apk(35.81 MB)
    emission-x86-build-20.apk(60.85 MB)
  • v1.5.0(Nov 15, 2016)

  • v1.4.0(Nov 3, 2016)

    performance and stability fixes:

    • unified usercache
    • proper deletion of obsolete cache documents
    • load trip diary without waiting for tour model
    • remove obsolete plugins to improve app load time
    • stats on app navigation

    Leaderboard!

    | Leaderboard | Icons moved | | --- | --- | | simulator screen shot nov 3 2016 12 08 27 am | simulator screen shot nov 3 2016 9 11 53 am |

    Note that we skipped a version because I was trying to investigate https://github.com/e-mission/e-mission-data-collection/issues/141 I bumped up the version one more time and then forgot to restore it before pushing to the stores. So v1.4.0 it is!

    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Aug 10, 2016)

    I am not sure if this can be called a release version, but we are submitting to the stores today, so I'm going to take the plunge and mark it as non-pre-release.

    The changes this time were mainly around fit and finish wrt preparing for the release.

    On the phone, these were:

    • Change the consent document to the newly approved version
    • Significant changes to the consent process
      • we now start tracking only after the consent is approved
      • if the user clicks on "I disagree", then we go to the heatmap, which is the only aggregate screen
      • the user is then in a non consented state, which means that any attempts to access any personal screens will pop up the consent screen again
      • we also support re-consenting, including a highlight of the changes since last time
    • Brand new metrics screen with raw graphs and summaries, user and aggregate data
    • Better search section that supports searching by timestamp and local date ranges

    | | | | --- | --- | | simulator screen shot aug 9 2016 9 48 14 pm | simulator screen shot aug 9 2016 9 48 18 pm | | simulator screen shot aug 9 2016 9 48 49 pm | simulator screen shot aug 9 2016 9 49 06 pm | | simulator screen shot aug 9 2016 9 49 33 pm | simulator screen shot aug 9 2016 9 49 41 pm | | simulator screen shot aug 9 2016 9 50 30 pm | simulator screen shot aug 9 2016 9 50 42 pm | | simulator screen shot aug 9 2016 9 51 09 pm | simulator screen shot aug 9 2016 10 01 37 pm |

    Source code(tar.gz)
    Source code(zip)
    emission-armv7-build-13.apk(56.69 MB)
    emission-L.-build-13.apk(36.72 MB)
    emission-x86-build-13.apk(60.32 MB)
  • v0.0.12-alpha(Jul 18, 2016)

    The theme for this release is: metrics!

    • Metrics API that returns daily, monthly, yearly summaries of various metrics, both wrt local time filters and UTC timestamp ranges
    • New metrics screen that shows trip count, distance and duration over time, split by mode. On the server, these are aggregate metrics - on the phone, they are individual metrics.
    • Thanks to @krisma, in addition, we have more detailed common trip and common place screens that show metrics about typical start times and durations.

    From a maintainability perspective, we have also integrated with ionic deploy http://docs.ionic.io/docs/deploy-overview which allows us to push UI changes without waiting for app store review. You might see more prompts to apply UI-only changes in the future as the native part of our code stabilizes and we focus on integrations and utility.

    We also have several fixes in the phone code, including one which adds a button to workaround the tile loading issue.

    | Refresh tiles | Metrics | | --- | --- | | refresh_tiles_workaround_button | metrics_v_12 | | common_trip | common_place |

    UI-only patch releases through ionic deploy

    v0.0.12-alpha-patch-1: a1ec2487ea96edca580790da0cde18b50ae56946

    notes:

    • fixed top left unknown and squeezing bars
    • Allow users to override the channel that ionic deploy is pulled from
    • Fix tile loading on android
    Source code(tar.gz)
    Source code(zip)
    emission-armv7-build-12.apk(55.05 MB)
    emission-build-12-appstore.ipa(30.86 MB)
    emission-L.-build-12.apk(35.08 MB)
    emission-x86-build-12.apk(58.68 MB)
  • v0.0.11-alpha(Jul 2, 2016)

    Major changes are:

    1. fix for visit tracking (@shankari)
    2. additional logging for startup (@shankari)
    3. fixes for last week's restructuring (@krisma)
    4. fixed common trips + better common trips UI (@shankari)

    Screenshots:

    | Map | Menu | List | | --- | --- | --- | | common_map | common_menu | common_list |

    ChangeLog:

    • Improve heatmap to indicate when loading is in progress
    • If we select the light theme, then the "Profile" link back from the recent tab is invisible
    • Add frequently used controls to the main profile screen
    • Restore refresh and hostname
    • Add additional logging for the startup
    • Restructure the common trips screen to be more complex
    • Add some additional preprocessing of the place information
    • Try again to get the map clicks to work
    • Added some additional parsing for the common trips information
    • Display information about the common trip linking the two common places
    Source code(tar.gz)
    Source code(zip)
    emission-armv7-build-11.apk(21.22 MB)
    emission-build-11-appstore.ipa(13.65 MB)
    emission-L.-build-11.apk(12.57 MB)
    emission-x86-build-11.apk(23.00 MB)
  • v0.0.10-alpha(Jun 26, 2016)

    User visible

    • Major rewrite of the UI with better timeline support and moving developer functions into a developer zone

    | Timeline support | Developer zone | | --- | --- | | list_view | detail_view |

    • Slimmed down apk on android. This should result in much faster load times.
      • only include the google play functionality that we use
      • crosswalk is only included on Lollipop (5.0, api 21)+ and the crosswalk "lite" is used for lower versions.
    • Support for configuring the sync interval and for choosing remote or local syncs

    Ongoing maintenance

    • upgrade of ionic to latest 1.3.1
    • stripped out unused nvd3 libraries
    Source code(tar.gz)
    Source code(zip)
    emission-armv7-build-10.apk(21.20 MB)
    emission-build-10-appstore.ipa(13.63 MB)
    emission-L.-build-10.apk(12.55 MB)
    emission-x86-build-10.apk(22.99 MB)
  • v0.0.9-alpha(Jun 9, 2016)

    • Updated plugins turn off debug UI notifications by default. They can be enabled again by turning on simulateUserInteraction from the config screen (android: e-mission/e-mission-data-collection@2cc112c, ios: shankari/cordova-unified-logger@f55fc2d)
    • Change the tilemap for the app maps from OSM to stamen toner + make it easier to change them in the future
    • Update README with information on reading phone logs + avoiding multi-dex on android
    Source code(tar.gz)
    Source code(zip)
    emission-armv7-build-9.apk(33.02 MB)
    emission-build-9-appstore.ipa(14.27 MB)
    emission-x86-build-9.apk(36.38 MB)
Query and print phone information from SimpleMDM

PhoneCat Query and print phone information from SimpleMDM. Currently only supports printing in CSV format. Usage Compile PhoneCat and print usage: swi

Clutter Inc. 5 Aug 17, 2021
Sample app to open parking lot gates by phone calls

DouzePointCinq - Test app Sample iOS app to open parking lot gates by phone calls. Screenshots (dark & light modes) How to use Clone the project git c

Anthony You 1 Oct 29, 2021
Simple camera application for iOS that uploads pictures to WebDAV server or Dropbox quickly. Available on the AppStore.

Upupu Simple camera application for iOS that uploads pictures to WebDAV server or Dropbox quickly. Also available on the AppStore. Features Easy and f

Xcoo 65 Nov 15, 2022
AirMessage Server, implemented natively in Swift

AirMessage Server AirMessage lets people use iMessage on the devices they like. AirMessage Server functions as the bridge between AirMessage client ap

AirMessage 90 Dec 29, 2022
Scan the MRZ code of a passport and extract the firstname, lastname, passport number, nationality, date of birth, expiration date and personal numer.

PassportScanner Works with 2 and 3 line identity documents. What is this With PassportScanner you can use your camera to scan the MRZ code of a passpo

Edwin Vermeer 441 Dec 24, 2022
SwiftGen is a tool to automatically generate Swift code for resources of your projects (like images, localised strings, etc), to make them type-safe to use.

SwiftGen is a tool to automatically generate Swift code for resources of your projects (like images, localised strings, etc), to make them type-safe to use.

null 8.3k Jan 5, 2023
A simple macOS app to read code from images, written purely in Swift using Vision Framework.

CodeReader A simple macOS app to read code from images, written purely in Swift using Vision Framework. Usage Drag an image Click the convert button R

Md Ibrahim Hassan 44 Nov 20, 2022
Code examples for Depth APIs in iOS

iOS-Depth-Sampler Code examples of Depth APIs in iOS Requirement Use devices which has a dual camera (e.g. iPhone 8 Plus) or a TrueDepth camera (e.g.

Shuichi Tsutsumi 1.1k Jan 2, 2023
Source code for the iOS app Screenshotter, on the App Store

Screenshotter This is the source code for the iOS app Screenshotter, available on the App Store. General Project Info Screenshotter is an Objective C

Riz 94 Mar 25, 2022
Source code for iOS app "Photos for VK" — albums and photos manager for social network VKontakte

VK Photos (formally Photos for VK) VK Photos is an iOS app for manage albums and photos in social network VKontakte (vk.com) Screenshots Disclaimer ⚠️

Yury S. 29 Oct 8, 2022
A better way to operate QR Code in Swift, support iOS, macOS, watchOS and tvOS.

EFQRCode is a lightweight, pure-Swift library for generating stylized QRCode images with watermark or icon, and for recognizing QRCode from images, in

EFPrefix 4.3k Jan 2, 2023
A very useful and unique iOS library to open image picker in just few lines of code.

ImagePickerEasy A very simple solution to implement UIImagePickerController() in your application. Requirements Swift 4.2 and above Installation Image

wajeehulhassan 6 May 13, 2022
Swift ports of Apple's Objective-C / C++ sample code

MetalSampleCodeSwift Swift ports of Apple's Objective-C / C++ sample code Metal is a great API, but it can feel inaccessible for Swift developers due

Jonathan Hobson 4 Dec 15, 2022
An app that uses Multipeer Connectivity to play a video across 6 different iOS screens with an additional phone acting as a Main/Control phone.

MultiScreenApp An app that uses Multipeer Connectivity to play a video across 6 different iOS screens with an additional phone acting as a Main/Contro

Vedant 113 Nov 21, 2022
A μlibrary in Swift containing all the countries with their localized name, ISO code, phone code, country code, flag image and emoji.

CountryKit CountryKit A μlibrary in Swift containing all the countries with their localized name, ISO code, phone code, country code, flag image and e

Alessandro 24 Nov 11, 2021
iOS App that allows a pilot to check drone photo collection after a mapping mission for any issues

DronePhotoChecker iOS App that allows a pilot to check drone photo collection after a mapping mission for any issues. Features: Connects to DJI drone

null 0 Dec 30, 2021
Nasa's Apollo missions summary, with astronauts and mission details

Moonshot Nasa's Apollo missions summary, with astronauts and mission details Screenshots Missions Mission highlights Mission astronauts Astronaut deta

Leonardo 0 Nov 19, 2021
Advanced usage of UIAlertController and pickers based on it: Telegram, Contacts, Location, PhotoLibrary, Country, Phone Code, Currency, Date...

Alerts & Pickers Advanced usage of native UIAlertController with TextField, TextView, DatePicker, PickerView, TableView, CollectionView and MapView. F

RV 5.5k Dec 22, 2022
🎯 Swift country and phone code Picker

CountryPicker Picker code Swift 3 / 4 / 5. Example To run the example project, clone the repo, and run pod install from the Example directory first. U

null 207 Dec 22, 2022