A mobile note-taking app, bullet journal, what-have-you
The contents are as follows:
A note-taking app that can be used on mobile:
- Either iOS or Android
- Does not depend upon cloud storage (can work offline)
- Possibly web (optionally)
Possible uses:
- Keep track of anything that might be put on a sticky
- An encrypted password store
Basically a slightly higher-tech version of a Bullet Journal.
There are a number of things that most of us have to carry around (keys, wallet, phone) so rather than add one more (bullet journal) it seemed like a good idea to write the kind of note-taking app that I would want, so that I could install it on my phone (or other device). Plus it then has the advantage of being both encrypted and password-protected (at least on Android).
For more on bullet journaling:
http://www.popsci.com/bullet-journal-guide/
The article is well worth a read. Here is a quote:
If you like Harry Potter, you can think of a bullet journal kind of like a Pensieve—a place to unload thoughts and reminders, which frees and focuses your mental and emotional efforts. Once you've written down all the tiny things you need to get done, you give your brain the capacity and the encouragement to actually do the things.
I also use this app in place of sticky notes, also as a kind of digital junk drawer.
Should be capable of:
- Local storage
Sync'ing with the cloud (optionally)
Ideally should NOT be dependent upon a device's Cloud account.
[Item 2, Cloud Sync'ing, was dropped. The app only uses local storage.]
- Either a Note title OR a Note body must be present
[The app can also be configured so that only the Note title shows when scrolling.]
- Note can be added
- Note can be flagged
- Note can be starred
- Note can be edited (double-tap)
- Note can be deleted (swipe, right-to-left only)
Notes can be filtered by star
or flag
.
- Application constants should be centralized in one place
- Persistent storage should be mediated by a DAO (facilitates easy swapping)
- Analytics should be mediated by a single component (to facilitate easy swapping of Analytics Providers)
- Application should be reactive, or - at least - stream-based
- Include a database maintenance option
- Significant events logged
- Should have native levels of performance for each platform (Android or iOS)
- Telemetry should not significantly impact performance (particularly in offline mode)
Application Events have been defined, Logging details have been investigated.
Follow Test Plan in English, French and (eventually) Spanish.
Unit tests as follows:
- Tests for singleton DAO
Some useful links follow.
[The links are in alphabetical order.]
As with Crash Reporting providers, there are many options.
Here is a list of Analytics Providers.
[These replace the previous APK (Android Package Kit) files. It is possible to install APK files but the Google Play Store requires AAB (Android App Bundle) files. Only APKs from trusted providers should be installed - Google offers a number of APK protections, which include scanning the APK for exploits.]
Overview: http://developer.android.com/platform/technology/app-bundle
AABs tend to reduce some of the bloat of APKs (see Fat APKs below for details of APK bloat), plus Google Play Store will handle the delivery of builds appropriate for the processor type of the target device. So generally a good idea (much research suggests reducing the download size of an app leads to more downloads).
About Android App Bundles: http://developer.android.com/guide/app-bundle
Test your Android App Bundle: http://developer.android.com/guide/app-bundle/test
How to sign an Android app: http://support.google.com/googleplay/android-developer/answer/7384423
Developer program is generally referred to as App Store Connect.
[formerly iTunes Connect, which still appears in older documentation.]
App Store Review Overview: http://developer.apple.com/app-store/review/
App Store Review Guidelines: http://developer.apple.com/app-store/review/guidelines/
App Store Submissions: http://developer.apple.com/app-store/submissions/
Analytics: http://developer.apple.com/app-store-connect/analytics/
Generally, apart from Unsigned IPA files, iOS apps should be signed by Apple. This requires certificates.
Apple certificates seem to fall into two categories: developer certificates and provisioning certificates.
Developer certificates are meant for local testing only.
Provisioning certificates can apparently be divided into App Store (for distribution to TestFlight or the Apple App Store) certificates and Ad Hoc (general distribution, probably for testing purposes, to anyone other than TestFlight or the Apple App Store) certificates.
For Ad Hoc testing it appears the device must be registered; for App Store (i.e. TestFlight) testing this does not seem to be the case.
To register the testing device, the UDID of the target device is required.
Home page: http://developer.apple.com/programs/
Gives access to TestFlight as well as App Store Connect.
[Acquired by Google; now called Firebase Crashlytics.]
http://firebase.google.com/docs/crashlytics/
Fabric roadmap: http://get.fabric.io/roadmap
[Acquired by Google; now integrated into Firebase. Links to all of the replacing Firebase products.]
Automate your development and release process
From: http://fastlane.tools/
Seems to be another integration platform, along the lines of Fabric.io (now owned by Google and integrated into Firebase) or buddybuild (owned by Apple). Unlike buddybuild, it covers both Android builds and iOS builds.
Can be used with Firebase App Distribution (which also covers both Android and iOS).
Initial 'fat' release:
app-release.apk 23 MB (23,086,334 bytes)
Targetted releases:
app-arm64-v8a-release.apk 8.6 MB (8,943,212 bytes)
app-armeabi-v7a-release.apk 8.2 MB (8,582,949 bytes)
app-x86_64-release.apk 8.8 MB (9,154,421 bytes)
[These are in roughly chronological order: the newest phones are probably ARM64 (v8a) processors; tablets and older phones are probably ARM (v7a) processors; and the oldest phones x86_64 processors (and there is an even older option - which is not a target build for this app).]
These APKs correspond to the following processors:
ARM app-armeabi-v7a-release.apk
ARM64 app-arm64-v8a-release.apk
x86_64 app-x86_64-release.apk
[It is non-trivial to determine the processor of an Android device. Trial-and-error works; this app is tested & working on ARM processor (both tablets and phones) devices and ARM64 processor devices.]
And the corresponding App Bundle:
app-release.aab 23 MB (23,207,957 bytes)
[The App Bundle should include builds for ARM, ARM64 and x86_64 - so this App Bundle should be about the same size as the Fat APK - which it is.]
built as the next evolution of Fabric's Crashlytics Beta
Covers both Android builds and iOS builds.
As of the time of writing (May, 2020) only supports APKs and IPA files (which must be signed). Android App Bundles are not supported.
Offers three integrations (from simplest to most complex):
- Firebase console
- Firebase CLI
- fastlane
[For Android builds, there is also Gradle.]
Nota Bene (mainly a warning):
Firebase App Distribution is a beta release. This means that the functionality might change in backward-incompatible ways. A beta release is not subject to any SLA or deprecation policy and may receive limited or no support.
From: http://firebase.google.com/docs/app-distribution
[Seems to be a viable alternative to TestFlight.]
Optional integration with Crashlytics.
[Similiar to Environment variables, effectively server-side parameters. As with Environment variables, need to define sensible fallback defaults.]
Enables A/B Testing, seasonal theming, as well as many other possibilities.
Overview: http://firebase.google.com/products/remote-config/
Firebase Remote Config is a cloud service that lets you
change the behavior and appearance of your app without
requiring users to download an app update. When using
Remote Config, you create in-app default values that
control the behavior and appearance of your app. Then,
you can later use the Firebase console or the Remote
Config backend APIs to override in-app default values for
all app users or for segments of your user base.
From: http://firebase.google.com/docs/remote-config/
Overview: http://developer.android.com/distribute/best-practices/launch
Apple apps are generally distributed as IPA files (the situation with Apple APPs and IPAs seems to be analagous to Android APKs and Android App Bundle files - both IPAs and Android App Bundle files are normally Signed).
Wikipedia is pretty informative on the subject of APPs: http://en.wikipedia.org/wiki/Bundle_(macOS)
Wikipedia is pretty informative on the subject of IPAs: http://en.wikipedia.org/wiki/.ipa
IPA files (actually archive files) are normally signed by a registered Apple Developer.
Sentry documentation: http://docs.sentry.io/
Sideloading has several advantages when compared with other ways of delivering content to mobile devices
For more on Sideloading: http://en.wikipedia.org/wiki/Sideloading
Beta Testing Made Simple with TestFlight: http://developer.apple.com/testflight/
TestFlight makes it easy to invite users to test your apps and collect valuable feedback before releasing your apps on the App Store. You can invite up to 10,000 testers using just their email address or by sharing a public link.
[Probably a good idea for iOS releases as Apple requirements are stringent. It sounds a lot like Fabric.io.]
TestFlight on the App Store: http://apps.apple.com/us/app/testflight/id899247664
Apple (iOS) devices have a UDID (Unique Device Identifier).
[This is apparently a 40-character hexadecimal string.]
For testing, it may be necessary to register these device IDs in advance.
[As with determining an Android device's processor type, determining an iOS device's UDID appears to be non-trivial.]
To determine the device's UDID: http://whatsmyudid.com/
How to open an unsigned IPA: http://support.apple.com/en-us/guide/mac-help/mh40616/mac
While it is possible to install unsigned IPAs, they may only be valid for seven days.
It may be necessary to register the UDID of the target device first.
The following sections cover:
- Application improvements (Android & iOS)
- General improvements not specifically related to the application
- Google Play Store / Android improvements (i.e. Android only)
- Apple App Store / iOS improvements (i.e. iOS only)
Please refer to the Roadmap.
- Add links for various deployment options
- Add notes on Android build architectures
- Add a Test Plan
- Investigate web drivers for testing
- Investigate the details necessary to effectively debug/analyze the app
- Instrument app events to a level of granularity sufficient for debugging & analytics
- Verify granularity of instrumentation for Metrics/Analytics/Debugging/Logging purposes
- Build and release for web
- Deploy to GitHub Pages
- Investigate Google Tag Manager
- Investigate SEO for apps
- [Optional] Integrate with Crashlytics or Sentry.io
- Internationalize everything
- Translations (English)
- Translations (French)
- Translations (Spanish)
- Have someone review French Translation
- Have someone review Spanish Translation
- Investigate Analytics Providers
- Investigate Firebase Remote Config
- Build and test for Android
- Investigate Google Play Store ads
- Investigate APKs versus App Bundles
- Investigate Android code-signing
- Set up a CI/CD pipeline
- [Optional] Test with Firebase Test Lab
- [Optional] Publish to Firebase App Distribution
- [Optional] Gather feedback from Beta-testers
- Publish to the Google Play Store
- [Optional] Benchmark performance (offline performance also)
- Upgrade to the latest tools (Java, Android Debug Bridge, Android Studio, Visual Studio Code)
- Build and test for iOS
- Investigate Apple APPs versus Apple IPAs
- Investigate Apple App code-signing
- Set up a CI/CD pipeline
- [Optional] Test with Firebase Test Lab
- [Optional] Publish to Firebase App Distribution or TestFlight
- [Optional] Gather feedback from Beta-testers
- Publish to the App Store
- [Optional] Benchmark performance (offline performance also)