* MOB-936 introduce new Android CI and Maestro smoke test
* Potential fix for code scanning alert no. 30: Workflow does not contain permissions
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
* remove branch exception to cache write rule
* delete unused new share flow
* add run to reintroduce workflow
* switch to -m runner for build
* redisable run on push
* add comments and update readme for changes
---------
Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com>
* Update package.json
* Update AppDelegate.mm
* Update Podfile
* Update .gitignore
* Update link-inat-model-files.sh
* Add plist file to project
* Update project.pbxproj
* Add analytics package
* Update project.pbxproj
* Update PrivacyInfo.xcprivacy
* Basic screen tracking
* Basic button press logging to firebase
* Update package-lock.json
* Update Podfile.lock
* Add Android setup
* Update .gitignore
* Add analytics mock
* Ignore rubocop warning here
* Create GoogleService-Info.example.plist
* Create google-services.example.json
* Add instructions to set up Firebase configs
* Update e2e_ios.yml
* Update e2e_android.yml
* Better plural
* Use specific XCode version in e2e CI
* Update GoogleService-Info.example.plist
* Revert "Update GoogleService-Info.example.plist"
This reverts commit 0bc0ed4862.
* We need an actual real app id or we get a crash during app start
* My bad, we do need both files for building
* Also set API key
* Add comments
* Add comment
* Update Podfile.lock
* Revert "Use specific XCode version in e2e CI"
This reverts commit cbd63d1b5d.
* remove assumed and undocumented meaning of page being zero from our use of
useInfiniteScroll in Explore; uses explicit type checks instead
* document byzantine pagination logic in useInfiniteExploreScroll
* fix broken infinite scroll when sorting by faves (was only showing first
page)
The underlying problem from 96c316a was setting initialPageParam to 1 in
useAuthenticatedInfiniteQuery, which seems rational, except
useInfiniteExploreScroll was using a false-ish value of page to detect when
it was requesting its first page. This does the same by being more explicit
about page's type without injecting undocumented meaning into the params we
hand to useInfiniteScroll.
* refactor: move Explore page param munging into unit tested helper
Closes MOB-400
* Also collect altitude from geolocation calls
* Update geomodel plugin
* Prop user location down into ai camera
* Add geo model file to be linked into xcode project
* Update env.example
* Update env.example
* Add geo model to cv model info file
* Update Developer.js
* Use user location for geo model while frame processing
useGeoModel boolean signals the frame processing plugin to use the geo model as well. It is turned on when we have a location.
* Update README.md
* Geo model is optional
* Adding a dummy neural network called geomodel.placeholder
This model doesn't do anything just returns the input. This is a overhead we could justify in my view as not to spend some more time figuring out how to make a model optional in an Xcode project.
* Geo model files are optional
* Update README.md
* Fix wrong model usage
* Update README.md
* This comment is no longer true
* feat: use full-text index on new _searchableName field (#2487)
Supports searches across non-contiguous tokens, e.g. finding "Mount Diablo
fairy lantern" with a query like "diablo lantern"
Related to #2348
* feat: add pull to refresh on notifications (#2489)
Closes#2349
* feat: show notifications from others (#2491)
* split notifications into tabs
* lots of TypeScript conversion
* feat: resize Heading5 and add Heading6 (closes#2480)
* fix: mark remote observations as viewed from ObsDetails
* feat: show indicator in Notifications tabs if unviewed notifications
Closes#2451
* feat: add option to save all observations from batch obs edit (#2493)
* fix: bring KebabMenu in line with designs
Closes#2268
* Update testing instructions
* v0.55.2
* v0.55.2+129
* fix: show observation from external link when Explore filters open (#2453)
* Open observation in app when link is pressed even if modals are open
* Remove comments
* Add comment and reset obsid
* fix: show onboarding content when signed in user has 0 observations (#2510)
Closes#2508
* fix: load new Explore results when filters change (#2507)
URL params got removed from the query key as a part of pull-to-refresh, but
that's how changes to filters were triggering a new request. This restores
that behavior, adds a test to ensure changes to filters call the API again,
and fixes the prior test of pull to refresh which was not testing the
equivalent behavior when pulling to refresh (API on first load, so the mock
needed to be cleared).
* fix: restore observation fetch when focusing on myobs (#2511)
* fix: center number in photo count (#2512)
Closes#2506
* refactor: minor edits for clarity
* fix: specify CV model version in e2e test
Hoping this deflakes the e2e a bit. Not sure why the AICamera test ever worked
without this.
* v0.55.3
* v0.55.3+130
* New Crowdin translations by GitHub Action (#2481)
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
* fix: get quality grade descs closer to designs; add Joanne to staff (#2517)
* fix: prevent BottomSheet title from overflowing over close button
* Update to Geomodel name
* Another name change
* Rename var and const names
* Rename const file references
* Also collect altitude from geolocation calls
* Update geomodel plugin
* Prop user location down into ai camera
* Add geo model file to be linked into xcode project
* Update env.example
* Update env.example
* Add geo model to cv model info file
* Update Developer.js
* Use user location for geo model while frame processing
useGeoModel boolean signals the frame processing plugin to use the geo model as well. It is turned on when we have a location.
* Update README.md
* Geo model is optional
* Adding a dummy neural network called geomodel.placeholder
This model doesn't do anything just returns the input. This is a overhead we could justify in my view as not to spend some more time figuring out how to make a model optional in an Xcode project.
* Geo model files are optional
* Update README.md
* Fix wrong model usage
* Update README.md
* This comment is no longer true
* refactor: minor edits for clarity
* Update to Geomodel name
* Another name change
* Rename var and const names
* Rename const file references
---------
Co-authored-by: Ken-ichi <kenichi.ueda@gmail.com>
Co-authored-by: Angie <angie@inaturalist.org>
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
* Add Fastlate app store metadata files as Crowdin translation sources
* Update i18ncli.js to move and rename translations so Fastlane can use them
* Update `fastlane prod` so it prompts for public release notes and cues a new
release in the App Store that still requires the manual attachment of a
build
* Add `fastlane android upload_metadata` to upload metadata to Play Store
Closes#2248
---------
Co-authored-by: Ken-ichi <kenichi.ueda@gmail.com>
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
* docs: add commit style and translation source guidance
* docs: specify that ppl should work on unassigned issues; separate and update getting started from submitting
* Updated to Fastlane 2.222.0
* Set up basic fastlane task to make a version in the App Store
* Remove iPad, MacOS, and Vision targeting
* Added note about metadata sync not working
* Documented fastlane prod behavior in the README
* Bump vision-camera
* Refactor patch
* Move patched orientation into patch functions file
* Update react-native-vision-camera+3.4.1.patch
* Switch to MacOS 13 runner
Vision camera requires XCode 15 to compile.
* Add step to specify XCode 15
* Higher level of logging
* Increase test timeout
* Add comment
* Remove navigation to obs without evidence for signed out user
* Patch for location permission not working on iOS
* Increase setup timeout
* Increase some more timeouts
* Revert back to less logging in CI
* Does it have to do with timeouts?
* Trace log level
* Update README.md
* Disable Homebrew’s auto update and install cleanup
* Setup ruby step
* Install pods only if not cached
* Revert "Install pods only if not cached"
This reverts commit 42a2ea02f9.
* Run simulator in headless mode, record all logs
* Increase timeouts again
* Revert "Remove navigation to obs without evidence for signed out user"
This reverts commit 2b4718f5ce.
* Add boolean to run use effect only once
* Did merge wrong code
* There is one more permission gate when entering obs edit now
* Add permission gate dismissal to signed out user test
* Add comment, rename state
* Lower action timeout
* Update react-native-vision-camera to 3.6, update Reanimated to v3 (#838)
* Bump camera and plugin
* Upgrade Reanimated and libs using it
* Update vision-camera mock
* Remove superfluous patch
* Fix type
* Add mocks for e2e tests because bottom sheet does not work on AOSP
* Update package-lock.json
* Update vision camera
* Bump vision camera
* Update vision camera patch version
* Remove superfluous patch
* Update vision camera
* Update vision-camera and plugin
* Use latest vision plugin = rebased v3
* Run npm clean-start
* No longer needed
* Duplicate prop
* Switch back to v3 code
* Upgrading Detox fixes issue with iOS tests failing
Because of previous lack of permissions.
* Update to latest detox version
* Npm i force
* Vision 3 e2e testing, (#1126)
* Remove jest detox config
* Revert e2e timeout increase
* Revert jest config timeout
* Use macos 14 runner which has XCode 15 per default
* Use latest bottom sheet
* Revert "Use latest bottom sheet"
This reverts commit c66cd09838.
* Adding comma back in
* Remove spaces
* Use latest vision-camera and plugin
* Use release version of vision-camera
* Remove force flag
* Update react-native-worklets-core
* Upgrade reanimated
* Update babel.config to allow nested worklets
* Run frame processor async
* Remove enableGpuBuffers flag
* Remove no longer needed comment
* Update comments about version
* Update vision-camera and plugin
* Code format
* Rename param
* Use latest-plugin
* Remove fps param from camera view
* Change confidenceThreshold to number
* API change for results structure
* Refactor fps to be checked inside hook
As of vision-camera 3.9.1 our camera feed is stuttering when calling the runAtTargetFps function inside the useFrameProcessor hook.
So, what I did here is to track the time and skip the frames that are received before the target fps is reached.
* Remove updates of non-camera related
* Update comment
* Code format
* Snapshot updates
* Revert changes to ios e2e
* Add a log for the average time it takes a frame to be processed
* Use release version of plugin
* Add a patch for runAsync to work in release builds
* Update react-native-worklets-core to 0.4.0
* Use latest plugin version
* Add a shift method to worklet arrays
* Use latest vision-plugin
This makes use of .shift() in worklet array and depends on the previous patch.
* Set result timestamp and show age of result in debug mode
* Fix an error with timestamp being undefined
* Remove log
* Use latest vision plugin
* Change result timestamp to pink
* Comment
---------
Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>
* Updated the README to be more explicit about how to make an internal test
release
* Added ML model and taxonomy file names to the About screen
* Changed the dirModel and dirTaxonomy exports from cvModel to be modelPath
and taxonomyPath since they point to files, not directories
iOS bundle files *must* be referenced in the xcode projects, which means that
updating the filenames in .env is not enough, you also have to add them to
the xcode project. This attempts to simplify this by assuming the named files
in the xcode project remain the same, but they are actually hard links to the
files specified in .env.
* Make minimum viable RemoteComment
* Minimum vialbe RemoteIdentification
* Minimum viable remote project, place, and messages
* Create minimum viable records for all remote factories
* Remove factories for local device data
* Minimum viable local taxon, comment, id
* Minimum viable for local observation photo (photo has no primary key)
* Minimum viable LocalUser
* Minimum viable record for LocalObservation
* use `shrink` tailwind class instead of hard-coded max widths to control
overflow in a few situations
* fixed some spacing issues with the Toolbar during upload
* center text in buttons by default
* export KebabMenu from SharedComponents (how was it working without this?)
* added some extra colors for debugging purposes
This uses an npm package to convert SVGs into an icon font, allowing us to
not step on each others' toes when adding new icons in branches and
simplifying the icon addition process. It also allows us to track changes to
the icons, and embed them directly as SVGs if we need to.
---------
Co-authored-by: Johannes Klein <johannes.t.klein@gmail.com>
Somehow many of the icon names in Fontastic were changed. This changes them
back to match what we use on the web and what we use in the main branch of
this repo, with a few exceptions to attempt to make names more consistent.
Also updated the README in the hopes of avoiding situations like this in the
future.
---------
Co-authored-by: Johannes Klein <johannes.t.klein@gmail.com>
* Add DateDisplay to ObsCard and make first pass at translation strings
* Add failing tests (due to lack of localization) for timeless dates
* WIP: trying to ensure i18next gets initialized before tests run
The remaining test failures might be legit. This probably breaks the actual
app, though.
* Got the rest of the tests working
* Updated tests to assume UTC
* Updated README to advise against using `npx jest` so test runs always have
the env vars we specify in our `npm test` script
* Moved i18next initialization to an explicitly-named file
* Use i18next init function in app
* Fixed up remaining tests
* Added test for non-English localization of date format
* Cleanup
* Made DateDisplay explicitly handle strings not Dates
* Restore skipped localization tests for MyObservations
* Remove duplicative tests from DateDisplay unit test
* Added note to the README about initializing i18next
* Updated change to DateDisplay in main
---------
Co-authored-by: Ken-ichi Ueda <kenichi.ueda@gmail.com>