-
Notifications
You must be signed in to change notification settings - Fork 72
Changelog
In development, delayed due to the events of 2020-2022 😞
This list of changes is not yet complete: https://github.com/metrodroid/metrodroid/pulls?q=is%3Apr+is%3Amerged+created%3A%3E%3D2020-01-01
- Adds support for ATTO.uz cards (thanks @phcoder) 🇺🇿
- Adds support for HOLO cards (thanks @ninjas28 and @frozenpandaman) 🇺🇸
- Adds support for Kyiv Digital cards and NDEF (thanks @phcoder) 🇺🇦
- Adds support for MRT Jakarta Multitrip cards (thanks @sybond) 🇮🇩
- Adds support for Tampere single-use cards (thanks @phcoder) 🇫🇮
- Adds support for Vladimir SitiCard (thanks @phcoder) 🇷🇺
- Adds new stops for Leap #702 #709 (thanks @badrpc) 🇮🇪
- Add new data for Clipper #701 #706 (thanks @ejnguyen) 🇺🇸
- Add new data for Go card #720 and more (thanks @micolous) 🇦🇺
- Add new data for Podorozhnik #740 (thanks @phcoder) 🇷🇺
- Amiibo: Fix reading Amiibos that have never been written to (thanks @micolous)
- Clipper: Fix vehicle numbers for LRV4 Muni vehicles, show line details for Ferry trips (thanks @ejnguyen and @stefanor) 🇺🇸
- EMV HCE: Detect Android-emulated cards, fix dumping from Google Pay, fix parsing bug (thanks @micolous)
- Go card: Add agency names (thanks @micolous) 🇦🇺
- Japan IC: Update English translations of actions, identify non-Suica but IC-compatible cards (thanks @phcoder, @micolous) 🇯🇵
- LAX TAP: Update card graphic with new design (thanks @frozenpandaman) 🇺🇸
- MyWay: Add support for Canberra Light Rail (thanks @micolous) 🇦🇺
- ORCA: Adds support for lines and Seattle Light Rail (thanks @ninjas28) 🇺🇸
- OVC: Update English translation of Card types (thanks @phcoder) 🇳🇱
- Zolotaya Korona: Show discount types (thanks @phcoder) 🇷🇺
- Android: Fix layout issues when using large fonts on Android (thanks @micolous)
- Android: New Material Design UI (thanks @phcoder)
- Android: Fix mapping provider (thanks @micolous) 🗺️
- FeliCa: Request Specification Version during dumps (thanks @micolous)
- JVM CLI: Rewrite smartcard support to use a new PC/SC-based API (thanks @micolous)
- JVM CLI: Localize the CLI (thanks @phcoder)
- Fix importing MCT files with unauthorised sectors (thanks @phcoder)
Tooling changes:
- Deterministically serialise MdST data (thanks @stefanor)
- mfcdump_convert.py: Add support for Mifare Plus 2K cards in conversion script (thanks @AetherEternity)
- Fix tests for Clipper (thanks @stefanor)
- Fix build issue on iOS (thanks @ejnguyen)
- Run linter checks in Travis CI (thanks @phcoder)
- Fix several test failures (thanks @micolous)
100% Production rollout in Google Play Store (2019-11-25).
Beta rollout in Google Play Store (2019-11-02).
- Adds support for iOS 13 📱 (on iPhone 7 and later) and an experimental Java SE CLI ☕ (note: This is not yet available on the App Store, due to a licensing issue which is not yet resolved. If you have an iOS Developer Certificate, you should be able to deploy a build to your own device(s).)
- Adds support for blue HSL cards, Waltti 🇫🇮
- Adds support for Cifial cards
- Adds support for reading serial number of Fribourg TPF card 🇨🇭
- Adds translations for Brazillian Portuguese (@MarlonColhado)
- Fix null trips with SLaccess
- Fix issue where Amiibo would not be detected on some devices
- Fix issue where currency values could not be read by a screen reader
- Fix showing passenger count when no company name is present
- Fix unsupported plurals that have no explicit numeral
- Fix zero-date transactions on Troika
- Fix layouts with right-to-left languages
- Fixes a couple of crash bugs impacting Android v4.3 and earlier (Jelly Bean)
- Adds new data for Adelaide Metrocard, Bonobus, Compass, Gautrain, Leap, Lisboa Viva, Rav-Kav, RicaricaMi, ORCA, OùRA and Touch 'n' Go
- Localize Umarsh region codes
- Adds support for MIFARE Plus cards (requires encryption keys)
- Supported cards list now grouped by region
- Show raw fields for RicaricaMi
- Adds search function to history
- Adds support for reading Farebot's JSON format
- Improves parsing of Bonobus and Lisboa Viva cards
100% Production rollout in Google Play Store (2019-07-28).
- Adds support for Amiibo 🇯🇵
- Adds support for Kazan transport card 🇷🇺
- Adds support for Santiago de Chile bip! 🇨🇱
- Adds support for Umarsh cards (Crimea Trolleybus and many cities in Russia)
- Adds support for Warszawska Karta Miejska 🇵🇱
- Adds monthly and yearly subscription codes for RicaricaMi 🇮🇹
- Adds support for travel passes on Touch n' Go and treats road tolls natively 🇲🇾
- Adds Samara garden-dacha cards and Orenburg cards for Zolotaya Korona 🇷🇺
- Adds support for Troika's Druzhinnik cards 🇷🇺
- Fixes incorrect times on Kartu Multi Trip 🇮🇩
- Various Intercode (France) improvements 🇫🇷
- Now shows both MIFARE Classic keys in raw view when available
- Fixes reading MIFARE Classic dumps inside a ZIP file
- Fixes the "share all" function from the card list screen
- Fix a crash on incomplete MIFARE Classic read
- Workaround a bug in Android 9 where selecting "NFC settings" goes to the wrong screen
- Adds some new card artwork
- Many under-the-hood cleanups and bug fixes
- Some CEPAS (Singapore) cards cannot be read due to a bug in their firmware
- Oyster support is still limited
100% Production rollout in Google Play Store (2019-07-11).
Minor release to fix issue in v2.9.41:
- Removes broken "copy all" / "share all" buttons from Card List screen. You can still copy and share single cards, and save either a single or all cards.
See 2.9.41 notes below for complete changes since 2.9.40 and release notes.
Replaced by 2.9.42.
- Adds support for EMV (credit / debit) cards 🌍
- Adds support for Komuterlink 🇲🇾
- Adds support for Pisa Carta Mobile and single-use tickets 🇮🇹
- Adds support for Metromoney 🇬🇪
- Adds support for first-generation Oyster 🇬🇧
- Adds support for Hafilat 🇦🇪
- Reads the serial number of Nol 🇦🇪
- Adds new stations for EZ-Link from Farebot
- Adds new stations for ORCA from Farebot
- Fixes an issue where PortAuthority cards would be detected as CharlieCard with bogus values. PortAuthority is not supported at this time.
- Fixes issues with some Mobib cards
- Adds support for importing binary MFC dump files
- Adds support for some DESFire cards with locked directory lists
- Several readers now use a new "raw fields" option (available in developer settings)
- Work-around incorrect reporting of MIFARE Classic support on Google Pixel 3 and 3a. They all support MIFARE Classic!
- Fixed: On Android 4.3 and later, now opens "NFC settings" instead of "wireless settings" when NFC is turned off.
- Adds artwork for many supported cards.
- Many refactorings and cleanups.
Some Singapore (CEPAS) cards are not detected by Android. This is caused by a combination of bugs in the card firmware and Android. This appears to primarily impact NETS FlashPay cards, but some EZ-Link cards (eg: Singapore Tourist Pass) are also impacted.
Cards with this bug have two detectable symptoms:
-
When using Metrodroid: holding the card to a device does not read at all, and there is no audible indication that a card was detected. However, there is communication between the card and the device (which can be detected with an ISO 14443B sniffer).
The same symptom can be seen in NXP TagInfo with reader mode off.
-
When using NXP TagInfo with reader mode on: when holding the card to a device, TagInfo will detect the same card repeatedly (about once per second).
In some devices (eg: Google Pixel 3a), trying to read one of these cards can crash the NFC stack on the phone. Fixing it requires either turning NFC off and then on again, using another app (which implements reader mode), or rebooting the device.
It might be possible to work around this issue in Metrodroid by implementing reader mode, which gives more direct control of the NFC controller (preventing Android from triggering these bugs in the card). However, this requires significant changes to Metrodroid to implement.
The Oyster card reader shows transaction event date and time, but does not show what they are or how much they cost. This reader is still under active development.
Second-generation cards (issued after 2009-12, which have a "D" in the printed lower-left corner of the card) are fully locked DESFire cards with no readable sectors.
This also does not work with ITSO-compatible travelcards, even if you have loaded a TfL season ticket on the card.
The EMV card reader does not read transactions from all bank cards -- this is a limitation of the card itself.
Merchant identification is generally not available.
Minor release to fix issues in v2.9.38 and v2.9.39.
Replaced by v2.9.40. Minor release to fix issues in v2.9.38.
- Fixes reading non-EV1 MIFARE Ultralight cards (used by Clipper single-ride tickets and others)
-
Fixes reading old T-Money dump files that don't have
<extra-records>
tag - Adds support for Touch 'n Go 🇲🇾
- Fix issue with hex-encoding integers in raw data displays
Replaced by v2.9.40.
- Adds support for Otago Gocard 🇳🇿
- Adds support for Rotorua SmartRide 🇳🇿
- Adds support for Waikato BUSIT 🇳🇿
- Adds support for Wellington Snapper 🇳🇿
- Go (SEQ): Add many new station IDs, Go Access and seeQ support 🇦🇺
- Metrocard (Adelaide): Adds new route IDs 🇦🇺
- Metrocard (Christchurch): Add note about new, fully-locked DESFire cards, and bus company names 🇳🇿
- Octopus: Fixes wrong balance 🇭🇰
- Podorozhnik: Adds all remaining stations on the St Petersburg Metro 🇷🇺
- Show subscription IDs
- Adds menu item to deduplicate scans
- New JSON file format used for internally storing cards. Existing XML files can still be read.
- DESFire: Show MFC AIDs (NXP AN10787) in raw data view.
- FeliCa: Rewritten, faster and more reliable reader. Adds missing codes for Edy 🇯🇵 and Kartu Multi-Trip 🇮🇩 in raw data view.
- Lots of cleanups, refactoring, porting to Kotlin (77%!), extra tests for ISO7816 and MFC cards
- Adds support for Beijing, Wuhan Tong, City Union and TUnion 🇨🇳
- Adds support for Clipper Ultralight cards 🇺🇸
- Adds support for Kiev metro card 🇺🇦
- Adds support for Metrocard (Adelaide) 🇦🇺
- Adds support for Orlando SunCard 🇺🇸
- Adds support for Rejsekort 🇩🇰 and Stockholm SLAccess 🇸🇪
- Adds support for Selecta 🇫🇷
- Adds support for TartuBus 🇪🇪
- Adds support for Zolotaya Korona cards (Krasnodar, Yaroslavl, and other locations) 🇷🇺
- Detects Prague Litacka 🇨🇿
- Reads serial on AT HOP 🇳🇿
- OVC: Fixes balance retrieval, switch to EN1545 parser
- Fixes a potential crash when viewing a card with a large number of purses or subscriptions
- Adds more stop locations for EasyCard and RicaricaMi.
- Adds support for dumping SFI files on ISO7816 cards.
- Works around a bug on Oppo Find7 which incorrectly reported it didn't support MIFARE Classic
- Multiple fixes for importing or exporting large card databases
- nfc-felica-lib moved into project proper
- Adds support for importing MIFARE Classic Tool dump files
- Lots of code cleanup/refactoring
- Adds support for CharlieCard, Go-to (Minneapolis) and Ventra 🇺🇸
- Adds support for Envibus, Navigo, OùRA, TaM and TransGironde (Intercode) 🇫🇷
- Adds support for reading IstanbulKart serial numbers 🇹🇷
- Adds support for Mobib cards 🇧🇪
- Adds support for Leap 🇮🇪
- Adds support for RicaricaMi 🇮🇹
- Adds support for reading Strelka serial numbers 🇷🇺
- Clipper: Adds VTA Light Rail stations.
- HSL: Fixes reader.
- Kartu Multi Trip: Adds many stations.
- Orca: Adds new stations.
- Suica: The two most recent trips now have times available.
- Detects blank MIFARE Classic cards.
- Fixes black-on-black text in lists on Android 4.4 (API 19) and earlier.
- MIFARE Classic: now supports JSON key format, and "static" keys that can be used on many cards.
- Adds support for Podorozhnik and Troika 🇷🇺
- Adds support for new FeliCa-based Kartu Multi Trip cards 🇮🇩
- Adds support for new ISO7816-based Shenzhen Tong cards 🇨🇳
- Adds support for Opus and Ultralight-based Compass cards 🇨🇦
- Adds support for Rav-Kav 🇮🇱
- Adds support for T-Money 🇰🇷
- Adds Indonesian and Russian translations.
- Multi-purse cards now display all purse balances on the balance screen (for hybrid Podorozhnik/Troika and Hu Tong Xing cards)
- Clipper: Fixes a crash-bug, and adds some new station IDs.
- New supported card list design based on Farebot.
- Single cards can now be saved to a file on Android 4.4+ from the Advanced Card Info screen.
- Storage permissions are no longer requested on Android 4.4+
- Card serial numbers are shown as a subtitle
- Saving files to Google Drive no longer results in empty files
- Suica: Fix a crash when opening the map
- EZ-Link: Various fixes, station list updates
- MIFARE Ultralight: Empty cards are now handled.
Backend / API changes:
- Adds support for reading ISO 7816 cards and from the Calypso application.
- Improves support for MIFARE Ultralight cards, adds support for NTAG213, NTAG215, NTAG216.
- CEPAS, HSL, Orca: Date and time handling clean-ups.
-
CompatTrip
,Refill
andRefillTrip
have been removed. - New
TransitBalance
andTransitCurrency
APIs (all readers have been migrated). -
TransitData
now supports multiple balances (TransitData#getBalances
). - Manufacturing information has been refactored.
- Sharing card data now uses the correct MIME type.
- Timezone support added for most cards. You can now optionally display the time of your trip in your local timezone.
- Clipper: Fix issue where travel times were incorrect by 2.5 minutes.
- Opal: Fix incorrect travel times on daylight savings time change days.
- New icon, which has adaptive shapes on Android O and later. The new icon will also display on older versions of Android, but won't adapt in shape.
- New transport mode icons, from NotoEmoji, which use vectors.
- New station database format (MdST), which reduces on-disk size and removes the need to copy the stop database into the cache.
- Some larger card images have been converted to JPEG to reduce size.
- Android Support Library now only includes needed components, to reduce size.
- Android 5.0 and later: When using a screen reader, Metrodroid can now provide hints to it about what language station names are written in using LocaleSpan. This improves the pronunciation of place names, particularly in Japanese. This works with Google Talkback.
- Many accessibility improvements.
- Adds experimental support for Metrocard (Christchurch) 🇳🇿
- Adds generic reader for ERG cards on MIFARE Classic, based on the Manly Fast Ferry reader.
-
Opal: Handle unknown status
0xc
(tap on rejected). -
ReadingTagActivity
: The "reading card" screen now shows what it is doing. MIFARE Classic really is that slow. - Fixes some internationalisation issues (hard-coded strings).
- Fixes obfuscation flags not always updating.
- Fixes button sizing issue on main screen.
- Fixes build issue for F-Droid.
Card reader changes:
- MIFARE Classic: Now tries the "other key" for a sector with a known key on file, in case you got Key A/B mixed up. Now picking Key A or B only sets the priority with which it attempts first authentication (which is consistent with the behaviour when "other" keys are tried. The Key A/B setting is only really useful when permission bits locked down for one of the known keys (see page 11 and 12 of the datasheet), and you get a successful authentication but permission bits say the sector or some of the blocks are not readable.
- MIFARE Classic: Use the standard Android check for MIFARE Classic on the about screen. The previous check incorrectly reported the Google Pixel 2 and Lenovo P2 as not supporting MIFARE Classic, but the cards would still work. See Issue #40 for details.
- MIFARE DESFire, MIFARE Ultralight: Fully locked cards now show a special message (like MIFARE Classic).
- MIFARE Ultralight C/EV1: Fixes "IOException" message when viewing (fully or partially) locked cards.
- MIFARE Ultralight C/EV1: Cards are now read to their full length.
API changes:
- Most classes have moved to the
au.id.micolous.metrodroid
namespace. -
Trip.getTimestamp
andTrip.getExitTimestamp
have been replaced byTrip.getStartTimestamp
andTrip.getEndTimestamp
.TripCompat
provides a workaround for providers that haven't yet been migrated. -
Trip.getRouteName
,Trip.get{Start,End}Station{,Name}?
, andTrip.get{,Short}AgencyName
now have stub implementations so providers that don't support these fields no longer need to explicitly stub it out.
- Adds Obfuscation Mode.
- CEPAS: Fix a crash with some unknown card format (likely from France).
- Mifare Classic: Fix a crash when viewing raw details when the card has been moved out of the field.
- Cubic Nextfare MFC: Support negative balances, handle balances better when version field overflows, hide null records.
- Go card: Add new stop IDs.
- Allows more mime types in card importer.
- Removes "Save to USB Storage" (which saves to a fixed location) option, which has been replaced with "Save to File" (which uses a file browser) for some time now.
- Updates Leaflet to 1.2.0.
- Adds support for SmartRider (WA, Australia).
- Adds translations in Dutch thanks to @Vistaus, French thanks to @Albirew, Hebrew thanks to @steets250
- MyWay: Auto-detect card by common key, which works on cards scanned with v2.9.31 and later.
- MFC: Make key available in
ClassicSector
.
- Cubic Nextfare MFC: Implement card expiry date (fixes #24), fixes subscription parser issue (fixes #28).
- Bilhete Único: Disable by default to avoid false positives with other agencies using Fudan Microelectronics FM11RF08 cards (#27).
- Transit Access Pass: Unknown Metro Bus routes now display the route ID.
- Adds support for MyWay (ACT, Australia), can be enabled in preferences.
- Work around an issue with reading MIFARE Classic cards present on HTC One M7, M8 and Sony Xperia Z with Android 5.x, as well as Galaxy Nexus with CyanogenMod 13.
- Improves detection of MIFARE Classic support to work around some vendor bugs.
- Fixes an authentication bug affecting Mifare Classic cards using MIFARE Application Directory or NFC Forum keys in slot A.
- Fix a permissions issue affecting some new installs on Android 6 and later.
- Clean up and improvement of
extras
Python scripts.
- Improve reliability authenticating with Mifare Classic cards.
- Adds support for Octopus (Hong Kong), Shenzhen Tong and Transit Access Pass (Los Angeles, CA, US).
- Adds a generic reader for Cubic Nextfare MFC (based on Go card reader).
- Export to USB Storage now allows you to pick a location on Android 4.4 (KitKat) and later.
- Go card: Fares are now retrieved from the card, so should work with all stations. Added 7 extra stations. Now detects Adult and Concession cards.
- Turned on Proguard to reduce binary size.
-
compile_stops_from_gtfs.py
can now work whenfeed_info.txt
is missing from the archive. -
mfcdump_to_farebotxml.py
now emits a per-cardlabel
attribute, which Metrodroid handles, to make differential card analysis much easier.
- Now requires Android 4.1 (API Level 16). Map display was broken on earlier versions.
- Added support for viewing raw FeliCa data.
- Added support for Mifare Ultralight, including raw data.
- Fixed an issue where 2 trips in the same month, different days, but same day of week, with no other trips between them, would not show the date header on the earlier trip (Issue #15)
- Go card: Added 11 extra stops, thanks to data donations from Brisbane Coder Club.
- Go card: Implement fare calculation, with some limitations.
- Added option for custom tile server URLs on map displays.
- Added support for FeliCa to farebotxml_to_files.py
- Farebot M is now Metrodroid.
- Implemented support for reading the card number from Myki (Melbourne, AU).
- Last digit of Go Card (Brisbane, AU) is now read.
- Improved handling of Mifare DESFire cards, including adding support for value files.
- Fixed support for NETS Flashpay (Singapore) cards which are also credit cards (patch by @chrisplus).
- Japanese translation improved greatly (thanks to @naofum).
- Trips and Refills are now combined into History for all cards.
- Google Maps have been replaced by Leaflet and StackPtr tiles.
- nfc-felica-lib no longer included as a static JAR, and is now a submodule.
- Update Google Play Services to a version just requiring the Maps component, significantly reducing size and permissions.
- Fix an issue where notes were jumbled for the Supported Cards list.
Not released on Google Play Store.
- Added basic support for Go card (Brisbane and South East Queensland, AU). Requires encryption keys (which are unique to each card) and device with Mifare Classic support. Limited stop support.
- Added card identification support for Adelaide Metrocard, AT HOP and Myki.
- Fixed importing individual cards from XML files.
- In the map view, the start of the trip is now the green marker, and the end of the trip is now the red marker. Previously, this was reversed.
- Redesigned the supported card list to be more intuitive.
- Refactored code for support databases (Felica, Go card, OVC).
Development tools, in extras
folder of source repository (not included on Play Store / APK release):
- New tools: compile_stops_from_gtfs, mfcdump_to_farebotxml
- farebotxml_to_files: now supports individual card exports
- find_in_bitfield: now shows positions relative in record
- stops-dot-farebot-m: New site for reporting unknown stops, used for Go card.
Current prod version on Google Play
- Minor bug fixes and refactoring.
- Crashlytics and Fabric (application performance monitoring) have been removed.
- Add support for Manly Fast Ferry (Sydney, AU). Requires encryption keys (which are unique to each card) and device with Mifare Classic support.
- Clipper: Add Oakland Airport transfer station from upstream pull request.
- Added About screen, so now you can see what version you are running. (Issue #3)
- Changed "Supported Cards" list to be in alphabetical order.
- Date and time formatting used in the application now obeys system settings. (Issue #5)
- Detects an absence of Mifare Classic hardware support, and reports this in the "Supported Cards" list and About screen. (Issue #4)
- Improved Mifare Classic key management. Keys no longer need to be in the correct order, and if a card uses the same key for all sectors, it only needs to be included once.
- Fixed an issue where the back button did not always work on the License screen.
- Reduced the size of the card images by about 1MB.
Development tools, in extras
folder of source repository (not included on Play Store / APK release):
- Added
farebotxml_to_files.py
, a tool to create binary files of card dumps from Farebot. - Added
find_in_bitfield.py
, a tool to find integers in an unknown bitfield. - Added
textkeys_to_farebotkeys.py
, a tool to "compile" a text file with a newline-separated list of keys to Farebot's binary format.
- Add support for Opal (Sydney, AU)
- Builds on current Android Studio
- Handles fully locked cards better by throwing an error which indicates the status more clearly
- Fix up some licensing issues