/Dads

*BA DUM TSSS*

Primary LanguageKotlinMIT LicenseMIT

CI codecov Fossa Status Android Weekly

Just an app with lame dad jokes content to fill up your day.

MVP

This MVP version features:

  • Feed walks you through the latest dad jokes,
  • Browse back seen jokes & share your favorite ones,
  • Notification to remind you up with latest available jokes,
  • Light/ Dark theme based on preference.

Stacks

Foundation

UI

Internal

  • LiveListAdapter
    ListAdapter w/ every visible cell (ViewHolder) is reactive. Cell acts like observer of data they hold, so it will auto-refresh if their related data is updated.
  • RenderExecutor Processor
    Processor for RenderWith annotation. Diff-state engine generator for rendering view component.

Remote

  • Apollo GraphQL - Client for requesting GraphQL API.
  • OkHttp - Request interceptors. Pipeline before remote API call.

Testing

  • Espresso - Android UI tests.
  • Hilt Testing - For swapping production dependencies with test doubles.
  • Truth - Assertion framework in tests by Google.

Health

  • Firebase Crashlytics - Collecting crash report for production environment.
  • LeakCanary (Debug) - Memory leak detector.
  • StrictMode (Debug) - Tool for checking if any should-be-background operation is done on main thread.

MAD Scorecard



Architecture

Dads adopts MVVM with Unidirectional flow (UDF) pattern.

Moreover, view components are rendered based on their related changed states only performed by diff-state engine, so the render operation is done more efficiently.

Design Principles

Testing Principles

  • Black-box/ behavior-driven testing with UI as the sole SUT (very recommended read and talk).
  • No mocking framework! Only fake type as test double, if required.

GraphQL Engine

Jokes are requested from proprietary GraphQL service, the Dads-Engine. Check it out 🔥

How to run

  • Since this project employs GraphQL stack, you need to download the schema first:
    • Go to hosted GraphQL Playground,
    • Open tab SCHEMA at the right side. DOWNLOAD it,
    • Put the schema.json in directory: libs/lib_remote/src/main/graphql/com/bael/dads/lib/remote/,
    • Or you can run this command as alternative.
      ./gradlew downloadApolloSchema --endpoint="https://dads-engine.herokuapp.com" --schema="libs/lib_remote/src/main/graphql/com/bael/dads/lib/remote/schema.json"
      
  • Set JWT key in keys.properties file (located in project root folder):
JWT=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhcHAiOiJEYWRzISIsInR5cGUiOiJVc2VyIn0.46oGvluHExsPIOS9d925RNYrk_Y9eke0Zm45ZbqjaXs
  • Have fun!

Caveat

After went through How to run section but you still get a "Service issue" state, hit TRY AGAIN? a couple of times until success. That's because I host data to the server with basic free plan - potato spec, well, it's just for research purpose anyway 😂.

Contributing

Let's get in touch if you're interested in contributing. Fork it, submit your PR.
Also feel free to open new issue, request features, or any kind of your support (join stargazers️ | treat me coffee 😁).

Those wonder what's next, check out my planned Roadmap by GitHub project board.

Licenses

FOSSA Status