{"id":18818203,"url":"https://github.com/helloimkevo/groovypaymentapp-dev","last_synced_at":"2026-03-06T23:31:13.023Z","repository":{"id":56717460,"uuid":"314385143","full_name":"HelloImKevo/GroovyPaymentApp-Dev","owner":"HelloImKevo","description":"This is an Interviewing Point-of-Sale App intended for Android Developer candidates. There are Android and iOS variants of this mobile payment App in the respective project directories. This application may include intentional compiler errors out-of-the box, and some of the features and screens described below are currently not implemented.","archived":false,"fork":false,"pushed_at":"2022-09-23T21:13:19.000Z","size":2339,"stargazers_count":1,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-12-09T10:46:16.066Z","etag":null,"topics":["android","android-application","java","stripe-payments"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HelloImKevo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-11-19T22:30:05.000Z","updated_at":"2025-02-22T16:58:16.000Z","dependencies_parsed_at":"2023-01-18T21:04:39.684Z","dependency_job_id":null,"html_url":"https://github.com/HelloImKevo/GroovyPaymentApp-Dev","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/HelloImKevo/GroovyPaymentApp-Dev","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HelloImKevo%2FGroovyPaymentApp-Dev","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HelloImKevo%2FGroovyPaymentApp-Dev/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HelloImKevo%2FGroovyPaymentApp-Dev/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HelloImKevo%2FGroovyPaymentApp-Dev/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HelloImKevo","download_url":"https://codeload.github.com/HelloImKevo/GroovyPaymentApp-Dev/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HelloImKevo%2FGroovyPaymentApp-Dev/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30203328,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T19:07:06.838Z","status":"ssl_error","status_checked_at":"2026-03-06T18:57:34.882Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-application","java","stripe-payments"],"created_at":"2024-11-08T00:15:34.222Z","updated_at":"2026-03-06T23:31:13.002Z","avatar_url":"https://github.com/HelloImKevo.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GroovyPaymentApp-Dev\nThis App is intended for Senior candidates. There are Android and iOS variants of this mobile payment App in the respective project directories. This application may include intentional compiler errors out-of-the box, and many of the functions and screens described below are currently not implemented.\n\n| Login Screen | Order Entry |\n| :---: | :---: |\n![Login Screen](ScreenMocks/Groovy-01-Login.png) | ![Order Entry](ScreenMocks/Groovy-13-OrderEntry.png)\n\n# First Steps: Repo \u0026 Project Setup\n* Create your own repository to store this project and all of your work.  \n* **Fork** or **Clone** this repository (**GroovyPaymentApp-Dev**) to your local machine, and then push your work to your repository using the instructions and CLI commands below for guidance:  \n\n```\n# Fork this project, and clone your fork to your local machine\ngit clone git@github.com:USERNAME/FORKED-PROJECT.git\n\n# To make a full copy (duplicate) of this repo without forking:\n# Navigate to your Github dashboard. Go to 'Your Repositories'.\n# Create a New Repository. Name it anything you'd like.\n# You can make it public or private.\n# Do not initialize the repository with a README.\n# Do not add a .gitignore. Do not add a license.\n\n# Clone this source repo onto your local machine.\ngit clone git@github.com:HelloImKevo/GroovyPaymentApp-Dev.git\n\n# Navigate into the new Git project directory.\ncd GroovyPaymentApp-Dev\n\n# Check what the current remote repository URL is:\ngit config --get remote.origin.url\n\n# Change the remote repository URL to your personal repository:\ngit remote set-url origin git@github.com:YOUR_USERNAME/YOUR_REPOSITORY.git\ngit config --get remote.origin.url\n\n# Push the entire contents of the Groovy Mobile Payments project to your personal repository:\ngit push\n\n# If you want to validate your Git environment is set up correctly, make a change to any file, then:\ngit add .\ngit commit -a -m \"Minor update to \u003cfile_name\u003e file\"\n\n# Should say something like 'Your branch is ahead of 'origin/master' by 1 commit'.\ngit status\n\n# Push your new commit to your remote Git repository for funsies.\ngit push\n```  \n\n* More repository management discussions:  \n  * Forking: https://help.github.com/en/github/getting-started-with-github/fork-a-repo\n  * Duplicating: https://stackoverflow.com/questions/18200248/cloning-a-repo-from-someone-elses-github-and-pushing-it-to-a-repo-on-my-github\n* Your repository can be **public** or **private**, but if it's private you'll need to adjust the repository settings to invite one or two of us as collaborators so we can review your commits.  \n\n#### Pull Requests and Code Review  \n* This is **optional**, but if you want good feedback on your submitted solutions you can create a **Pull Request** (in _your_ repository) and notify us when it is ready for review. There's an example Pull Request in **this** repository for reference: https://github.com/HelloImKevo/GroovyPaymentApp-Dev/pull/2  \n* Additional information can be found under the [Git Workflow References](#git-workflow-references) section.\n\n#### Stripe SDK Setup  \n* Create a **Stripe Developer Account** over at: https://dashboard.stripe.com/register  \n* Grab your **Publishable** and **Secret** API keys from your dashboard: https://dashboard.stripe.com/test/apikeys  \n* The Stripe SDK architecture is built around the expectation of using a Client-Server model, where the Client (Mobile App) uses a **Publishable** API key, and the Server uses a **Secret** API key to generate a **Client Secret** string. We don't have a Server for this test application, so we emulate the \"Server\" within our app. The Android and iOS applications both use asynchronous utilities for generating a **Client Secret** using the Stripe **Secret** API key.  \n\n### [[ Android Project Setup \u0026 Code Style ]](Android/README.md)\n\n### [[ iOS Project Setup \u0026 Code Style ]](iOS/README.md)\n\n# Expectations\n* Okay, **phew**. If you made it this far, you're in good shape :+1: hopefully that stuff didn't take too much time (it gets easier with practice).  \n* This project is comes with a **[Business Requirements Document (BRD)](#business-requirements-document-brd)** that is modeled after real-world business requirements. It is effectively a coding assessment designed to help us identify your **Skills** and **Areas of Expertise** and **Attention to Detail**, while providing you a little bit of exposure to the payments industry and our **Git Workflow**.  \n* We recommend spending **about 8 Hours** implementing solutions to any number of the [Business Requirements](#business-requirements-document-brd) listed below, but you are welcome to spend as much time as you'd like to accomplish any number of the tasks.  \n* It is suggested that you work on tasks that demonstrate your strengths as a developer. For example, if you've got a lot of familiarity with **Encryption \u0026 Decryption** mechanisms, you might want to implement an encryption framework for the `User.Password` model data for the login flow. Alternatively, if you enjoy working with multi-threaded systems, feel free to rewrite the **SQL Database** implementation or the asynchronous network calls to the Stripe API.  \n\n# Submission Review Guidelines  \n* After you push commits to the project, our team will **Review** your work and provide **Constructive Feedback** on how to improve your code readability, code organization, your approach to solving the problem, or sometimes we will just banter about random technology trends or the latest data breaches :grimacing:  \n* Oftentimes, code style is **Subjective**, and there's no right or wrong answer, and that's okay! If you disagree with our feedback, let us know why you wrote it that way - we look forward to learning new things and better practices from you :grin:  \n* Code style and consistency is important to us - we take pride in every line of code we write, and encourage you to do the same. The **Android** team generally adheres to all AOSP Contributor Guidelines (See: [Android README](Android/README.md)) and the **iOS** team generally adheres to all iOS Contributor Guidelines (See: [iOS README](iOS/README.md)).  \n* Android submissions can be written in **Kotlin** or **Java**.  \n* iOS submissions can be written in **Swift** or **Objective-C**.  \n* We are more interested in the **Quality** of your submissions, rather than the quantity of submissions.  Quality is assessed using some of these parameters:  \n  * Is the **Code Style** consistent? (Do variables follow the same standard conventions? Is the code formatted with the same indentation levels?)  \n  * Is the **Git History** clean and well-organized? Can we run a `git log --oneline` and figure out how the candidate implemented their solution for the task? Recommended reading: https://chris.beams.io/posts/git-commit/\n  * Are the methods / functions designed to be small and **Focused**? (It is, however, recognized that long methods are sometimes appropriate.)  \n  * Is complex or obscure logic **Documented**? Are comments used effectively?  \n  * Does the **Code Architecture** follow recommended developer patterns?  \n  * Does the Android code use K\u0026R bracing style? https://en.wikipedia.org/wiki/Indentation_style#K\u0026R_style  \n  * Does the iOS code use Allman bracing style? https://en.wikipedia.org/wiki/Indentation_style#Allman_style  \n* Like many other successful companies, we aim to follow a **Test-Driven Development** paradigm. Unit Tests and Instrumentation tests are strongly encouraged!  \n\n# Questions or Concerns?  \n* For any company-related or interview-related questions, reach out to your point-of-contact (likely a **Hiring Manager**).  \n* If you would like to keep your work in a **private repository**, please notify the **Hiring Manager**, and they will provide you a list of email addresses for the code reviewers that you'll need to invite as collaborators to your repository.  \n* If you have **technical questions** or need assistance with this project, ask the **Hiring Manager**, and they will provide you with the email addresses of one of our team members, and you can email us your question directly, and we will do our best to help.  \n\n# Business Requirements Document (BRD)  \n\n## Task ID: #001 - Main Dashboard Crash  \n#### Estimated LOE (Level of Effort): 1 Hour  \n\n[//]: # (Line breaks must be added to control text wrapping for multi-line rows, otherwise the image will get squashed)\n\n| Requirements | Business Mock |\n| :--- | --- |\n| The application currently **crashes** when a `Placeholder` button is clicked \u003cbr\u003eon the main dashboard.\u003cbr\u003e\u003cbr\u003eDesign an alert dialog that is shown with an `\"Under Construction\"` type \u003cbr\u003eof message instead of crashing. | ![Construction Dialog](ScreenMocks/Groovy-04-UnderConstruction.png) |\n\n## Task ID: #003 - Product List Facelift  \n#### Estimated LOE (Level of Effort): 2 Hours  \n\n| Requirements | Business Mock |\n| :--- | --- |\n| Users of this application have complained that the Product list looks very \u003cbr\u003ebland. (We've gotten lots of negative feedback on the Google Play Store and Apple App Store)\u003cbr\u003e\u003cbr\u003eUpdate the style of the products to match this new mock from the Design \u003cbr\u003eteam as closely as possible (or use your creativity to implement a better design). | ![Order Entry](ScreenMocks/Groovy-13-OrderEntry.png) |\n\n## Task ID: #004 - Language Translation of Your Choice\n#### Estimated LOE (Level of Effort): 2 Hours  \n\n| Requirements | Business Mock |\n| :--- | --- |\n| Google Play Store users have left us lots of negative feedback because the \u003cbr\u003eapplication only supports English and Spanish.\u003cbr\u003e\u003cbr\u003eFor this task, localize all of the app's string resources to another language\u003cbr\u003eof your choice. Go through the app and extract any hard-coded strings as necessary.\u003cbr\u003e\u003cbr\u003e:warning: **You do not need to worry about the names and descriptions of database entities.** | ![Spanish](ScreenMocks/Groovy-09-Spanish.png) |\n| The system language can be changed at Runtime under System settings. | ![System Language](ScreenMocks/Groovy-07-SystemLanguage.png) |\n\n## Task ID: #005 - Database-Driven Payment Types  \n#### Estimated LOE (Level of Effort): 4 Hours  \n\n## Task ID: #006 - Display the Order History  \n#### Estimated LOE (Level of Effort): 3 Hours  \n\n| Requirements | Business Mock |\n| :--- | --- |\n| Load the `Cart` models from the database and display them in Order History. | ![Order Entry](ScreenMocks/Groovy-12-OrderHistory.png) |\n\n## Task ID: #007 - Checkout with Cash Payments!  \n#### Estimated LOE (Level of Effort): 4 Hours  \n\n| Requirements | Business Mock |\n| :--- | --- |\n| Currently, there is no way to complete the Checkout flow, because we \u003cbr\u003ehaven't implemented **Cash** or Credit support. The \"Pay with Cash\" screen has \u003cbr\u003ea 10-digit Keypad, but it isn't wired up. \u003cbr\u003e\u003cbr\u003e:warning: **Bonus points for allowing the User to over-pay or under-pay, and \u003cbr\u003eshow the User how much Change is Due to the Customer.** | ![Checkout with Cash](ScreenMocks/Groovy-14-CheckoutCash.png) |\n\n## Task ID: #009 - Pay with a Credit Card Number  \n#### Estimated LOE (Level of Effort): 4 Hours  \n\n| Requirements | Business Mock |\n| :--- | --- |\n| Currently, there is no way to complete the Checkout flow, because we \u003cbr\u003ehaven't implemented Cash or **Credit** support. The \"Pay with Credit\" screen \u003cbr\u003ehas a Stripe `CardInputWidget`, but it isn't wired up. \u003cbr\u003e\u003cbr\u003eEvery Stripe payment requires a **Client Secret** string to be generated (the \u003cbr\u003e**Client Secret** is derived from the transaction amount, the currency type, and your \u003cbr\u003e**Publishable API Key**), so you'll need to generate a **Client Secret** when the User \u003cbr\u003eclicks the `PAY (CREDIT)` button, and then process the payment using \u003cbr\u003e`com.stripe.android.Stripe.confirmPayment()`. \u003cbr\u003e\u003cbr\u003eReferences: \u003cbr\u003ehttps://stripe.com/docs/payments/accept-a-payment#android  \u003cbr\u003ehttps://stripe.com/docs/testing   | ![Checkout with Credit](ScreenMocks/Groovy-17-CheckoutCredit.png) |\n| Consider logging or displaying the response from Stripe. | ![Credit Success](ScreenMocks/Groovy-16-StripeCreditSuccess.png) |\n\n## Task ID: #010 - Navigate to the Checkout Complete Screen  \n#### Depends on Pay with Cash or Pay with Credit implementation  \n#### Estimated LOE (Level of Effort): 2 Hours  \n\n| Requirements | Business Mock |\n| :--- | --- |\n| When the Customer finishes paying for the Order, navigate to the \u003cbr\u003eCheckout Complete screen. | ![Checkout Complete](ScreenMocks/Groovy-18-CheckoutComplete.png) |\n\n## Task ID: #011 - User Database Schema \u0026 Proper Login  \n#### Estimated LOE (Level of Effort): 6 Hours  \n\n| Requirements | Business Mock |\n| :--- | --- |\n| Generate some `UserEntity` records and implement a proper login flow! | ![Login](ScreenMocks/Groovy-01-Login.png) |\n| Show details about the currently logged in **User** on the User Profile screen. | ![User Profile](ScreenMocks/Groovy-10-UserProfile.png) |\n\n## Task ID: #012 - User Password Encryption \u0026 Decryption  \n#### Estimated LOE (Level of Effort): 6 Hours  \n\n## Task ID: #013 - Tables, and Charts, and Graphs, Oh My!  \n#### Estimated LOE (Level of Effort): 6 Hours  \n\n| Requirements | Business Mock |\n| :--- | --- |\n| Use any open-source Charts \u0026 Graphs library to represent any type of data you'd like. \u003cbr\u003e\u003cbr\u003eReferences: \u003cbr\u003ehttps://github.com/PhilJay/MPAndroidChart  \u003cbr\u003ehttps://github.com/AnyChart/AnyChart-Android    | ![Daily Reports](ScreenMocks/Groovy-21-DailyReports.png) |\n\n## Git Workflow References\n\nUseful git commands for quickly traversing repos:  \n```\n# Display your git configuration\ngit config --list\ngit config --global -l\n\n# Display all remote branches\ngit branch --remote\n\n# Concise view of git history\ngit log --oneline\n\n# Visual graph of git history\ngit log --oneline --graph --all --decorate --abbrev-commit\n\n# See how many lines of code you've changed\ngit diff --shortstat\n\n# Pushing from a local repository to GitHub hosted remote\ngit remote add origin git@github.com:USERNAME/REPO-NAME.git\n\n# Clone your fork to your local machine\ngit clone git@github.com:USERNAME/FORKED-PROJECT.git\n\n# Creating a new remote branch\ngit checkout master\ngit pull\ngit checkout -b pr-task-solution\ngit push -u origin pr-task-solution\n\n# Remove a git ignored file that is being tracked\ngit rm -r --cached .\ngit add .\n\n# Stash your local changes\ngit add .\ngit stash save \"Implement solution for Task 001 - Work in progress\"\ngit stash apply stash@{1}\n\n# Preview your stashed changes\ngit stash list\ngit stash show -p stash@{1}\n\n# Un-commit and stage changes from most recent commit\ngit reset --soft HEAD~1\n```\n\n## GitHub Standard Fork \u0026 Pull Request Workflow  \n* Github pull request reviews documentation: https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-request-reviews  \n* Useful link about project forks: https://gist.github.com/Chaser324/ce0505fbed06b947d962  \n* Great YouTube video tutorial \"Creating a Simple Github Pull Request\" by Jake Vanderplas: https://www.youtube.com/watch?v=rgbCcBNZcdQ  \n\n```\n# List all remote pull requests\ngit ls-remote origin 'pull/*/head'\n\n# Fetch a specific pull request into a local branch and with a custom name\ngit fetch origin pull/2/head:pr-new-feature\n\n# Fetch a pull request from a fork repo and patch it as a local branch\ngit fetch git@github.com:vikvelma/ForkedPaymentApp.git refs/pull/3/head:pr-forked-feature\n```\n\n# Useful References\n\n### Game-Icons.net  \nMany thanks to the contributors and maintainers over at game-icons.net :joy: it has been an extremely helpful resource in prototyping mobile applications.  \nhttps://game-icons.net  \n\n### Stripe\nhttps://stripe.com/docs/development  \n\n### Retrofit\nhttps://square.github.io/retrofit  \n\n### Gson\nhttps://github.com/google/gson  \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhelloimkevo%2Fgroovypaymentapp-dev","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhelloimkevo%2Fgroovypaymentapp-dev","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhelloimkevo%2Fgroovypaymentapp-dev/lists"}