GithubHelp home page GithubHelp logo

path-check / safeplaces-dct-app Goto Github PK

View Code? Open in Web Editor NEW
467.0 44.0 285.0 71.24 MB

COVID Safe Paths (based on Private Kit) is an open and privacy preserving system to use personal information to battle COVID

Home Page: https://covidsafepaths.org

License: MIT License

JavaScript 19.93% Starlark 0.21% Java 11.29% Ruby 2.62% Objective-C 1.05% Shell 1.65% Batchfile 0.42% HTML 14.85% Kotlin 4.07% Swift 6.96% TypeScript 36.96%

safeplaces-dct-app's Introduction

COVID Safe Paths

pathcheck logo

https://pathcheck.org/


Project Overview

Help us stop COVID-19.

COVID Safe Paths is a mobile app for digital contract tracing (DCT) sponsored by Path Check a nonprofit and developed by a growing global community of engineers, designers, and contributors. Safe Paths is based on research originally conducted at the MIT Media Lab.

Privacy Preserving

What’s truly special about Safe Paths is our strong commitment to preserving the privacy of individual users. We're building an application that can help contain outbreaks of COVID-19 without forcing users to sacrifice their personal privacy. For example, if a user chooses to use Safe Paths to maintain a record of their locations use a time stamped GPS log, which stores 14 days of data in 5 minute increments. The location log is stored on the user's phone. The logged data only leaves the device if the user chooses to send the information to an authorized public health authority (PHA) as part of the contact tracing process.

Multiple Capabilities

Safe Paths is designed to support a range of DCT and public health use cases. Currently the main build uses GPS for location tracking. Our roadmap includes adding support for other location and proximity technologies, symptom tracking, and communication with PHAs.

Multiple Implementation Strategies

The Safe Paths app is being developed to support a variety of build 'flavors' of the application around core health and tracing functionality. Reach out to our team to discuss creating a flavor for your use-case.

Path Check Release of COVID Safe Paths

Safe Paths is available as an app published by Path Check in the Apple App Store and the Google Play App Store. Any authorized pubic health authority can use Safe Paths.

Custom Builds

We welcome public health authorities and other organizations implementing digital contact tracing strategies to create custom builds for their specific needs, incorporate Safe Paths features into their applications, or create downstream projects that stay linked to the Safe Paths project. If intending to fork the repository and develop off of it, be aware that this comes "at your own risk" for continued maintenance.

End-to-End System

Safe Paths is designed to work with Safe Places, a tool for contact tracing teams to work with location data in the course of contact tracing interviews and to publish points of concern. Without having to sharing their own location history, a Safe Paths user can download the points of concern from their PHA to identify if they have had risk of an exposure.

Broad Non-Developer Community

One of the important aspects of the Safe Paths open source project is that it's supported by a large community of volunteers in addition to the open source developer community. Spanning as diverse domains as product management, user research, cryptography, security, compliance, design, and videography more than 1,400 Path Check volunteers are working together to support Safe Paths and help drive adoption around the world.

Learn More

COVID Safe Paths Website

Apps Gone Rogue: Maintaining Personal Privacy in an Epidemic - The original white paper.

COVID Safe Paths Slack - Where the community lives.

Path-Check/gaen-mobile - PathCheck's GAEN based contract tracing solution.

Downloads for COVID Safe Paths

Google Play | Apple Store


Development Overview

Android and iOS build on MacOS

Safe Paths is built on React Native v0.61.5

Contributing

Read the contribution guidelines.

If you're looking for a first ticket - please check out the backlog for a bug or first story JIRA project.

Architecture

View the architecture diagram for a basic overview on the sequencing of generalized events and services that are used by Safe Paths.

Developer Setup

First, run the appropriate setup script for your system. This will install relevant packages, walk through Android Studio configuration, etc.

Note: You will still need to configure an Android Virtual Device (AVD) after running the script.

Linux/MacOS

dev_setup.sh

Windows

dev_setup.bat

Environment

Populate the following .env files. View an example file at example.env

.env.dev
.env.staging
.env.release

You can configure AUTHORITIES_YAML_ROUTE against https://raw.githubusercontent.com/Path-Check/trusted-authorities/master/staging/authorities.1.0.1.yaml.

ZENDESK_URL can be omitted in development, and the Report Issue page will throw an error when submitting.

Running

Note: In some cases, these procedures can lead to the error Failed to load bundle - Could not connect to development server. In these cases, kill all other react-native processes and try it again.

Android (Windows, Linux, macOS)

yarn run-android ## for the location enabled app

Device storage can be cleared by long-pressing on the app icon in the simulator, clicking "App info", then "Storage", and lastly, "Clear Storage".

iOS (macOS only)

First, install the pod files:

yarn install:pod ## only needs to be ran once

Then, run the application:

yarn run-ios ## for the location enabled app

Device storage can be cleared by clicking "Hardware" on the system toolbar, and then "Erase all content and settings".

Privacy settings can be reset by going to Settings > General > Reset > Reset Location & Privacy

Release Builds

Generating a release build is an optional step in the development process.

Debugging

react-native-debugger is recommended. This tool will provide visibility of the JSX hierarchy, breakpoint usage, monitoring of network calls, and other common debugging tasks.

Tooling

TypeScript

This project is using typescript.

Run the complier with:

yarn tsc

Not every file needs to be written in TypeScript, but we are preferring to use TypeScript in general.

Note that for React-Native projects, TypeScript complication is handled by the metro-bundler build process and there is no need to emit js code into a bundle as one would do in a web context, hence the inclusion of the --noEmit flag.

Prettier

This project is using prettier.

We have a local prettierrc file, please make sure your development environment is set to use the project's prettierrc.

Husky

This project is using husky to automate running validation and tests locally on a pre-push git hook.

If you ever need to push code without running these scripts, you can pass the --no-verify flag on git push.

ESLint

This project is using eslint.

We have linting checks on CI, please make sure to include the checks locally in your IDE.

Testing

Tests are ran automatically through Github actions - PRs are not able to be merged if there are tests that are failing.

Static Testing

To run the static analysis tools:

yarn validate

Unit Test

To run the unit tests:

yarn test --watch

Snapshot testing is used as a quick way to verify that the UI has not changed. To update the snapshots:

yarn update-snapshots

e2e Test

Note: Right now, there is only e2e test support for iOS.

e2e tests are written using detox. Screenshots of each test run are saved to e2e/artifacts for review.

To run the e2e tests:

yarn detox-setup ## only needs to be run once
yarn build:e2e:ios ## needs to be run after any code change
yarn test:e2e:iphone{11, -se, 8}

Manual Device Testing

Mobile devices come in many different shapes and sizes - it is important to test your code on a variety of simulators to ensure it looks correct on all device types.

Before pushing up code, it is recommended to manually test your code on the following devices:

  • Nexus 4 (smaller screen)
  • iPhone 8 (smaller screen)
  • Pixel 3 XL (larger screen)
  • iPhone 11 (screen w/ notch)

safeplaces-dct-app's People

Contributors

aledustet avatar alpita-masurkar avatar davidbiga avatar devinjameson avatar efalkner avatar esantus avatar harshvitra avatar jacobjaffe avatar jeffstolz avatar jin-stuff avatar johnschoeman avatar jvisenti avatar kenpugsley avatar octohub avatar pathakparth avatar patrick-erichsen avatar penrods avatar rparet avatar sammakesthings avatar sreekarhub avatar thetimbanks avatar tnekret avatar tparesi avatar tremblerz avatar troach-sf avatar tstirrat avatar vitorpamplona avatar vlasac avatar yonatanmk avatar zhaccc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

safeplaces-dct-app's Issues

Combine and curate location data

Have the location data store under single object, not as independent pieces.

Basic operation logic:

locs = []
if ("loc_data" exists)
   temp_locs = load("loc_data")

   # Curate
   for (i=0; i < len(temp_locs); i++)
      if (temp_locs[i] < 28 days old)
         locs += temp_locs[i]

...

# After every snapshot
save(locs)

Update branding

Once the name is finalized, update the repo name, app strings, and any documentation that references "mobileapp"

Import Module: Load waypoints and path points from Google's Take out file

Google has several semantic ways to log lat, long. The current implementation only imports placeVisit.locations.

Use the following JSon for reference.

{
  "timelineObjects" : [ {
    "activitySegment" : {
      "startLocation" : {
        "latitudeE7" : 423712157,
        "longitudeE7" : -710801235
      },
      "endLocation" : {
        "latitudeE7" : 423889867,
        "longitudeE7" : -710885437
      },
      "duration" : {
        "startTimestampMs" : "1580515266408",
        "endTimestampMs" : "1580515754966"
      },
      "distance" : 2353,
      "activityType" : "IN_PASSENGER_VEHICLE",
      "confidence" : "HIGH",
      "activities" : [ {
        "activityType" : "IN_PASSENGER_VEHICLE",
        "probability" : 81.76090121269226
      }, {
        "activityType" : "WALKING",
        "probability" : 8.278883248567581
      }, {
        "activityType" : "STILL",
        "probability" : 8.125560730695724
      }, {
        "activityType" : "CYCLING",
        "probability" : 1.0427268221974373
      }, {
        "activityType" : "IN_BUS",
        "probability" : 0.3525716718286276
      }, {
        "activityType" : "MOTORCYCLING",
        "probability" : 0.2875321079045534
      }, {
        "activityType" : "IN_FERRY",
        "probability" : 0.0427420309279114
      }, {
        "activityType" : "RUNNING",
        "probability" : 0.03588703693822026
      }, {
        "activityType" : "IN_TRAM",
        "probability" : 0.028896320145577192
      }, {
        "activityType" : "IN_TRAIN",
        "probability" : 0.024446286261081696
      }, {
        "activityType" : "FLYING",
        "probability" : 0.008416806667810306
      }, {
        "activityType" : "SKIING",
        "probability" : 0.005187333226785995
      }, {
        "activityType" : "SAILING",
        "probability" : 0.00476947971037589
      }, {
        "activityType" : "IN_SUBWAY",
        "probability" : 0.0013954329915577546
      }, {
        "activityType" : "IN_VEHICLE",
        "probability" : 7.47239539578004E-5
      } ],
      "waypointPath" : {
        "waypoints" : [ {
          "latE7" : 423710594,
          "lngE7" : -710801620
        }, {
          "latE7" : 423863258,
          "lngE7" : -710905609
        }, {
          "latE7" : 423890876,
          "lngE7" : -710887298
        } ]
      }
    }
  }, {
    "placeVisit" : {
      "location" : {
        "latitudeE7" : 423890312,
        "longitudeE7" : -710873334,
        "placeId" : "ChIJ1WFe6dBw44kRJUBchSYYOwQ",
        "address" : "192 Broadway\nSomerville, MA 02145\nUSA",
        "name" : "Pastelaria Vitoria Broadway",
        "sourceInfo" : {
          "deviceTag" : 584934457
        },
        "locationConfidence" : 97.59531
      },
      "duration" : {
        "startTimestampMs" : "1580515754966",
        "endTimestampMs" : "1580517709770"
      },
      "placeConfidence" : "HIGH_CONFIDENCE",
      "centerLatE7" : 423890592,
      "centerLngE7" : -710873954,
      "visitConfidence" : 94,
      "otherCandidateLocations" : [ {
        "latitudeE7" : 423897552,
        "longitudeE7" : -710871984,
        "placeId" : "ChIJw2tLwdBw44kRFba_DA_Hx1g",
        "locationConfidence" : 0.75358087
      }, {
        "latitudeE7" : 423890312,
        "longitudeE7" : -710873334,
        "placeId" : "ChIJSVnC7tBw44kR1oS-EJkqp0Y",
        "locationConfidence" : 0.42350954
      }, {
        "latitudeE7" : 423898700,
        "longitudeE7" : -710876090,
        "placeId" : "ChIJP5glxdBw44kRc1lm9vWMjJQ",
        "semanticType" : "TYPE_SEARCHED_ADDRESS",
        "locationConfidence" : 0.2731733
      }, {
        "latitudeE7" : 423906046,
        "longitudeE7" : -710868862,
        "placeId" : "ChIJaTaVStdw44kRTKBU4LdaEGw",
        "locationConfidence" : 0.24667592
      } ],
      "editConfirmationStatus" : "NOT_CONFIRMED"
    }
  }, {
    "activitySegment" : {
      "startLocation" : {
        "latitudeE7" : 423888999,
        "longitudeE7" : -710879550
      },
      "endLocation" : {
        "latitudeE7" : 423916225,
        "longitudeE7" : -710855273
      },
      "duration" : {
        "startTimestampMs" : "1580517709770",
        "endTimestampMs" : "1580518069792"
      },
      "distance" : 362,
      "activityType" : "IN_PASSENGER_VEHICLE",
      "confidence" : "MEDIUM",
      "activities" : [ {
        "activityType" : "IN_PASSENGER_VEHICLE",
        "probability" : 74.45971369743347
      }, {
        "activityType" : "STILL",
        "probability" : 15.32638967037201
      }, {
        "activityType" : "WALKING",
        "probability" : 8.971372991800308
      }, {
        "activityType" : "CYCLING",
        "probability" : 0.9968267753720284
      }, {
        "activityType" : "RUNNING",
        "probability" : 0.09207993862219155
      }, {
        "activityType" : "MOTORCYCLING",
        "probability" : 0.06667065899819136
      }, {
        "activityType" : "IN_FERRY",
        "probability" : 0.030013773357495666
      }, {
        "activityType" : "IN_BUS",
        "probability" : 0.027368837618269026
      }, {
        "activityType" : "SKIING",
        "probability" : 0.016939605120569468
      }, {
        "activityType" : "IN_TRAM",
        "probability" : 0.004777643334819004
      }, {
        "activityType" : "FLYING",
        "probability" : 0.003842801379505545
      }, {
        "activityType" : "SAILING",
        "probability" : 0.0028253632990526967
      }, {
        "activityType" : "IN_TRAIN",
        "probability" : 0.001140081076300703
      }, {
        "activityType" : "IN_SUBWAY",
        "probability" : 3.529360412812821E-5
      }, {
        "activityType" : "IN_VEHICLE",
        "probability" : 8.94935823225751E-6
      } ],
      "waypointPath" : {
        "waypoints" : [ {
          "latE7" : 423890037,
          "lngE7" : -710881652
        }, {
          "latE7" : 423910942,
          "lngE7" : -710867080
        }, {
          "latE7" : 423918151,
          "lngE7" : -710858764
        } ]
      }
    }
  }
]} 

BUG: App beeps regularly

When installed on a real phone, the app beeps every time it captures a GPS coordinate. Very irritating and a sure way to get uninstalled!

Feature - Localize the app to support various languages

What is the feature -

Setup Internationalization framework to make the app multilingual.

What this feature can do -

  1. detect the user language
  2. load the translations
  3. optionally cache the translations
  4. etc

Why is it needed -

When the app will reach millions of people around the globe, they will prefer to have it in their local language.

Improve Google Location Data import experience

The Import functionality is great, but still tricky to use. It might take a few iterations to get it to what we want, but here are some thoughts:

Break the Import into three stages, kinda like an old-school Wizard.

  1. "Intro" page.
    Explain what this does and give instructions to log in and start the process w/Google.
    Q: Can we explore the DOM on the webview? It would be cool to watch for an indicator that the request for a takeout has happened, then move to the "Waiting" step described below.
  2. "Waiting on Google takeout" page
    If the user returns to Import page, show a message that we are still waiting on the takeout file.
    Include a "Start over" button to go back to Step 1 in case something fails.
  3. "Import Complete"
    After an import completes, the results of the import should be remembered and displayed. E.g.
    "28 day of data imported from Mar 1 - Mar 28".
    Also have an "Import again" button that goes back to step 1.

During Step 2 the user should be be able to leave the app or go back to the main page. We should have a background task look for the takeout file when one is pending, so you don't have to go back to Import. The app should show a notification when the takeout file is found and process completes.

Discussion is welcome. I expect the implementer will find challenges and opportunities to improve this sequence. For instance, there might be a step 2.5 that helps with the download of the Takeout file.

Import Locations from Google on iOS: Browser opens the Zip file in the Webview.

On Android, the app saves a file in the Downloads folder.

On iOS, the WebView shows the zipped binary file in the app itself.

We need to figure out a way to either download it to a file and then open with the SearchAndImport function or keep it in memory (500MB in memory?) and pass it to the SearchAndImport function.

Refine Share

The basic Share functionality works, but it could use some refinement. Specfically two things:

  • Improve the filename. Currently it is ".null". Change it to be "PrivateKit_.json"
  • Add a message body. Try:
    Here is my location log from Private Kit.
  • If titles are supported, make it: "Shared PrivateKit_.json"

No indicator during Location service failures

There are several reasons that location information might not be working properly:

  • GPS has been turned off
  • User disabled the permission under settings
  • Under iOS, app was shutdown in the background
  • Probably others

We need to validate access to GPS and notify/prompt the user when this happens.

FEATURE: Add Face/Pin/whatever unlock on open

Use the operating system's current unlocking mechanism to open the app and show the data. The idea is to minimize snooping without the permission of the phone's owner. A good example of good implementation is the unlocking feature of Signal's Messaging app.

Implementations have to work on iOS and Android.

Apple Rejection: Do we need Motion Tracking?

We noticed that your app requests the user’s consent to access their motion but does not clarify the use of the motion in the applicable purpose string.

Next Steps

Please revise the relevant purpose string in your app’s Info.plist file to specify why the app is requesting access to the user's motion and location. You can modify your app's Info.plist file using the property list editor in Xcode.

To help users understand why your app is requesting access to their personal data, all permission request alerts in your app should specify how your app will use the requested feature.

FEATURE: Verify application freshness

Add a mechanism to remind the user to update if they have turned off auto-updates on their phone.

The first version can be a simple notification when the app is outdated.

Add webview

The "Info: N/A" needs to become a webview

The location settings alert box is not consistent

Right now for the phone versions which don't show 3 options for location (while using, always, never) but instead 2 options (always/yes, never), the location prompts up for them unnecessarily. We will have to dig deep into the response numbers by the geolocation api.

BUG: iOS version not building from 'develop'

Currently you cannot build the iOS version of the app. The error reference the 'tripleblind' app, so it is likely that it has to do with renaming packages.

Can test against the first release off of the 'master' branch, which I believe did function.

Need to test on iPhone

So far this hasn't been run on iOS at all. Especially interested in the location service and if it runs in the background properly.

VERIFY: Backfill Stationary point captures if needed

The BackgroundGeolocation library has the ability to only report changes in location when the user moves. This saves power in some cases, e.g. if the phone is sitting on a charger and not moving, the accelerometer shows it is stationary. The library saves power by returning a Stationary point.

Verify the behavior around this. I suspect it only generates a callback once, then stops calling until the phone moves again. If this happens, upon the move we should backfill so that we have the same point reported at 5 minute intervals until that next point report.

Example:

@3:01 - I set my phone down on the desk
@3:02 - The BackgroundGeolocation callback triggers and we save a coordinate
@3:40 - I move my phone
@3:40 - The BackgroundGeolocation callback triggers and we save a coordinate

If the above does occur (which we need to verify), we should save the same reported coordinate from 3:02 at 3:07, 3:12, 3:17, 3:22, 3:27, 3:32, 3:37 and then save the new 3:40 coordinate.

iOS build fails with yarn install

In my setup, I required to perform pod install as well in order to get npx react-native run-ios running successfully.

Xcode 11.3.1
yarn 1.2.4
Catalina 10.15.3

Build fail log -

info Found Xcode workspace "PrivateKit.xcworkspace"
info Building (using "xcodebuild -workspace PrivateKit.xcworkspace -configuration Debug -scheme PrivateKit -destination id=2B640F2E-4BE8-4FEC-9D36-4B3D0E9EF7AA")
............
error Failed to build iOS project. We ran "xcodebuild" command but it exited with error code 65. To debug build logs further, consider building your app with Xcode.app, by opening PrivateKit.xcworkspace. Run CLI with --verbose flag for more details.
note: Using new build system
note: Planning build
note: Constructing build description
error: /Users/safepath/Workspace/private-kit/ios/Pods/Target Support Files/Pods-PrivateKit/Pods-PrivateKit.debug.xcconfig: unable to open file (in target "PrivateKit" in project "PrivateKit") (in target 'PrivateKit' from project 'PrivateKit')
error: /Users/safepath/Workspace/private-kit/ios/Pods/Target Support Files/Pods-PrivateKit/Pods-PrivateKit.debug.xcconfig: unable to open file (in target "PrivateKit" in project "PrivateKit") (in target 'PrivateKit' from project 'PrivateKit')
error: /Users/safepath/Workspace/private-kit/ios/Pods/Target Support Files/Pods-PrivateKit/Pods-PrivateKit.debug.xcconfig: unable to open file (in target "PrivateKit" in project "PrivateKit") (in target 'PrivateKit' from project 'PrivateKit')
error: /Users/safepath/Workspace/private-kit/ios/Pods/Target Support Files/Pods-PrivateKit/Pods-PrivateKit.debug.xcconfig: unable to open file (in target "PrivateKit" in project "PrivateKit") (in target 'PrivateKit' from project 'PrivateKit')
error: /Users/safepath/Workspace/private-kit/ios/Pods/Target Support Files/Pods-PrivateKitTests/Pods-PrivateKitTests.debug.xcconfig: unable to open file (in target "PrivateKitTests" in project "PrivateKit") (in target 'PrivateKitTests' from project 'PrivateKit')
error: /Users/safepath/Workspace/private-kit/ios/Pods/Target Support Files/Pods-PrivateKitTests/Pods-PrivateKitTests.debug.xcconfig: unable to open file (in target "PrivateKitTests" in project "PrivateKit") (in target 'PrivateKitTests' from project 'PrivateKit')
error: /Users/safepath/Workspace/private-kit/ios/Pods/Target Support Files/Pods-PrivateKitTests/Pods-PrivateKitTests.debug.xcconfig: unable to open file (in target "PrivateKitTests" in project "PrivateKit") (in target 'PrivateKitTests' from project 'PrivateKit')
error: /Users/safepath/Workspace/private-kit/ios/Pods/Target Support Files/Pods-PrivateKitTests/Pods-PrivateKitTests.debug.xcconfig: unable to open file (in target "PrivateKitTests" in project "PrivateKit") (in target 'PrivateKitTests' from project 'PrivateKit')


** BUILD FAILED **


iOS not building on develop (45fc937419069a94dab3d4dd11deab4f33b080a0)

I am getting this error on the iOS build for develop 45fc937

It gets stuck on a white screen and the app fails to load. I tested release v0.5 and it worked.

Device iPhone 8 - iOS 13.3.1

2020-03-16 01:01:35.631 [info][tid:main][RNGestureHandlerManager.m:136] [GESTURE HANDLER] Initialize gesture handler for root view <RCTRootContentView: 0x1013049b0; reactTag: 1; frame = (0 0; 375 667); gestureRecognizers = <NSArray: 0x2800f1170>; layer = <CALayer: 0x280eb8ec0>>
2020-03-16 01:01:35.660749-0700 PrivateKit[438:28526] +backgroundSessionConfiguration: is deprecated. Please use +backgroundSessionConfigurationWithIdentifier: instead
2020-03-16 01:01:35:660 PrivateKit[438:28526] Backing up original handler.
2020-03-16 01:01:35:660 PrivateKit[438:28526] Setting new handler.
2020-03-16 01:01:35.693860-0700 PrivateKit[438:28526] Current db version: 3
2020-03-16 01:01:35:694 PrivateKit[438:28519] BgGeo #configure: Config: distanceFilter=50 stationaryRadius=50 desiredAccuracy=0 activityType=OtherNavigation activitiesInterval=10000 isDebugging=0 stopOnTerminate=0 url= syncThreshold=100 maxLocations=10000 httpHeaders={
} pauseLocationUpdates=0 saveBatteryOnBackground=0 locationProvider=1 postTemplate={
    foo = bar;
    lat = "@latitude";
    lon = "@longitude";
}
2020-03-16 01:01:35.695266-0700 PrivateKit[438:28523] BgGeo #configure: Config: distanceFilter=50 stationaryRadius=50 desiredAccuracy=0 activityType=OtherNavigation activitiesInterval=10000 isDebugging=0 stopOnTerminate=0 url= syncThreshold=100 maxLocations=10000 httpHeaders={
} pauseLocationUpdates=0 saveBatteryOnBackground=0 locationProvider=1 postTemplate={
    foo = bar;
    lat = "@latitude";
    lon = "@longitude";
}
2020-03-16 01:01:35.696687-0700 PrivateKit[438:28519] Configuration persisted succesfuly
2020-03-16 01:01:35.700 [error][tid:com.facebook.react.JavaScript] TypeError: s.registerHeadlessTask is not a function. (In 's.registerHeadlessTask(o,n)', 's.registerHeadlessTask' is undefined)

This error is located at:
    in n
    in Unknown
    in Unknown
    in Unknown
    in Unknown
    in RCTView
    in RCTView
    in RCTView
    in RCTView
    in u
    in PanGestureHandler
    in RCTView
    in u
    in RCTView
    in n
    in Unknown
    in RCTView
    in j
    in RCTView
    in C
    in o
    in n
    in RNCSafeAreaView
    in Unknown
    in Unknown
    in RCTView
    in n
    in Unknown
    in Unknown
    in ForwardRef
    in Unknown
    in ForwardRef
    in n
    in n
    in RCTView
    in RCTView
    in h

Improve the saved point description

Currently the Export page shows some basic info about the saved data. It displays:
Points to be shared: 6134

We should expand this into something more friendly. Describe number of points, oldest date, and how recently it was updated.

Example:

Log has 22 days, 345 points, last updated 4 minutes ago.

Once that is possible, we can see it if will fit on the main screen, updated each time a new point is saved.

NOTE: Be aware that the stored datetime info is in UTC. Should be able to just subtract the first point's time from the current unixtimeUTC, then do division to figure out the number of days saved.

Google Import should expand logged points for duration

During the import of Google data the time is imported a single time/coordinate. However, the Google data has durations, so we should use that to expand points. This will be useful later in the intersections.

Basically, the Google data contains something like:

[ 
 {"placeVisit": {
      "location" : {
        "latitudeE7" : 423936728,
        "longitudeE7" : -710802770,
      },
      "duration" : {
        "startTimestampMs" : "1583085476383",
        "endTimestampMs" : "1583086992817"
      },
   }
}
...
]

The start time is: Sunday, March 1, 2020 5:57:56.383 PM
and the end time is: Sunday, March 1, 2020 6:23:12.817 PM

That is 26 minutes of the user at the same point, so import it in 5 minute intervals so it looks like:
[
{ startTimestampMs, latitudeE7, longitudeE7 },
{ startTimestampMs + 5 minutes, latitudeE7, longitudeE7 },
{ startTimestampMs + 10 minutes, latitudeE7, longitudeE7 },
{ startTimestampMs + 15 minutes, latitudeE7, longitudeE7 },
{ startTimestampMs + 20 minutes, latitudeE7, longitudeE7 },
{ startTimestampMs + 25 minutes, latitudeE7, longitudeE7 },
]

Don't stress too much about overlap between places, we can work with having time segments that are narrower than 5 minutes. But we will likely have issues intersecting in encrypted space with a timespan between points that is > 5 minutes.

Additionally, the transit points aren't being imported. It would be nice to import waypoint data.

Feature request: self-reporting features

From conversations with @ericlavigne on the MIT TR article:

  1. Due to the delay in testing, it might be better to implement self-reporting of previously visited locations (via pinpoints, not long/lat). The users would be able to populate at least some of the data not collected because they didn't install the app at the time, the app crashed on some days, etc.

  2. We could implement the possibility of checking for negative results/ absence of symptoms, when distributing warnings to contacts. Might be useful to trace secondary contacts and refine predictions.

FEATURE: Import Google Location data

It would be valuable to have a button that will reach out one time to import the user's Location history from Gogole. This would give them an instant 28 day cache moments after installing the application.

Security scan: OWASP Mobile Top 10

We should scan the v1 release candidate to make sure we haven't introduced any obvious security problems. OWASP Mobile Top 10 is a good start.

FEATURE: Export trails

Look into using a QR code to either hold the location trail or hold the key to decrypt a version uploaded to a public drop URL (any anonymous drop).

Add info on what trails exist

Display very simple information on the status of trails. E.g. at the bottom of the main app:

    Trails:  12 days, last updated 2 minutes ago

Android: App Crash

App Crashes when Denied permission for "location" access permission when started app for the first time.

Audit licenses

We need to audit the licenses of all plugins in. Note any that require a visible attribution. If we have any, we will need to create an About page that shows that.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.