# Android Northstar Development Stack
## Programming Language
### Kotlin
#### Pros
- Extension functions/properties
- Similarity to Swift for maintaining iOS parity
- Help with developer brand
- Coroutines
- Null safety
- Delegation patterns for composition over inheritance situations
- Data classes
- Inferred type, more concise
#### Cons
- No Package Private, are there any alternatives? Internal doesn't necessary work.
- Could we use an "internal" package to get around semantic versioning requirements.
- Could we have a internal extensions?
- Less noise with autocomplete.
- Internal functions on public classes?
- **Internal modules** -> use implementation over api for these with gradle.
- Java interop isn't as nice, have to be aware of specific annotations.
- @JvmOverloads for example
### Java
## Coding Standards / Best Practices
#### Pros
- Package Private
## Bulid/Deploy
- Version 0...
- Can release v0.x.x to allow for breaking changes until we get to 1.0.0
- Where is the SDK being deployed to?
- MavenCentral -- Cardinal?
- Let's assume we won't need Cardinal.
- How often will we release new versions of the SDK?
- Target: end of each sprint, but reserve the right to not release if we aren't quite ready.
- Sarah -> Braintree currently monthly, but working on large features.
- Tim -> every two weeks if we are writing unit tests.
- Long standing features, feature flags?
- Steven -> If we can deliver value, deliver it. Regular cadence would be nice.
- Snapshot builds?
- Used them in v3, not in v4.
- Maybe?
- GitHub Actions for CI provider
- Pull request hooks
- Static analysis?
- Visible Metics ->
- Surfacing test reports.
- Reports should be easy to read & understand.
- Android Lint -> Fail on lint warnings BUT if the rule isn't necessary we can discuss the rule and add it to an excludes.
- Kotlin -> Detekt, open to other options as well.
- Testing
- Steven -> rake test command helps with debugging tests locally.
- Manual Testing -> Tokenization keys
- Google Pay, Samsung Pay, Venmo Pay
- Sandbox merchants useful for different scenarios, combining that with physical devices for e2e testing.
- Unit Testing
- Will practice TDD, no specific metric in mind (by default it will probably be a percentage of coverae)
- Will use a coverage tool like Codecov to track this and provide it to merchants though our GitHub repo.
- Integration Tests
- End To End Tests
- Browser Stack for physical device testing.
## Quality Standards
### Testing
- Unit
- Robolectric -> Uri
- Test Driven Development
- Integration
- For time being we'll defer integration until we need to test specific edge cases.
- E2E
- Start off with E2E tests to validate functionality.
### Deprecation Policy
- Some classes will be exempt from the policy and we'll say which classes are and why.
- This would allow us to use Kotlin and not have to worry about the lack of package private.
## Third Party Libraries
- Jetifier -> needed for Cardinal 👎
- Don't use libraries that aren't on Android X
- Data Collector may need to be updated.
- PayPal Checkout needs to be updated.
- Auth SDK needs to be updated (why PayPal Checkout needs Jetifier).
- SDK Size?
- Could we monitor this as part of CI.
- Baseline on Braintree SDK size?
- R8 for minifying output?
- Retrofit
- Serialization
- [GSON](https://github.com/google/gson)?
- [Jackson](https://github.com/FasterXML/jackson)?
- [Moshi](https://github.com/square/moshi)?
- [KotlinX Serialization Library](https://github.com/Kotlin/kotlinx.serialization)?
- Coroutines
- Could use Flow for RxJava-like code?
- Anything Jetpack 👍
- Dagger for dependency injection?
- Can investigate to see if this will work for us.
- Navigation Component
- Can investigate if we have UI specific code to work with.
- Data persistence?
- Shared Preferences?
- Could be used for most data?
- Local Database?
- Probably not needed.
- Work Manager
- ? mockk -- possibly but need more info
- ? Robolectric -- not great with powermock, when it works it works
- Device Automator
## Architecture
- Extract business logic away from Android framework to promote testing.
- Can we make use of kotlin stdlib to avoid JsonObject, etc.
- Can revisit once we have some work scoped out.