Coder Social home page Coder Social logo

judahben149 / spendr Goto Github PK

View Code? Open in Web Editor NEW
1.0 1.0 2.0 1.63 MB

Spendr is a stylish budgeting app with a clean, notebook-like UI design

Kotlin 100.00%
clean-architecture dagger-hilt neumorphism-ui navigation-component epoxy lottie-android room-persistence-library mvvm paging3 coroutines

spendr's Introduction

Spendr

Spendr is a stylish budgeting app with a clean, notebook-like UI. This design is mostly based on the neumorphic design style. Built with Modern Android Development practices in mind, it adheres to clean architecture and keeps up with latest industry standards.

Features

  • Clean and focused UI.
  • Dark mode support.
  • Create notification reminders for intending payments.
  • Visualize expenses with charts.
  • Export single budget entry or entire budget as PDF.

Check out Spendr

Get it on Google Play

Prerequisites

  • Android Studio Flamingo | 2022.2.1
  • Min SDK 23
  • Target SDK 33
  • Java 17
  • AGP 8.0.0
  • Kotlin 1.8.0

Setup 🛠️

  1. Clone the repository git clone https://github.com/judahben149/Spendr.git
  2. Open in Android Studio.
  3. Configure prerequisites if any errors.
  4. Sync the project.

Build Tools and Patterns

  • Kotlin - 100% kotlin.

  • Neumorphism UI - Provides neumorphic-style views and UI elements.

  • MVVM - Employs the officially recommended MVVM design pattern.

  • Clean Architecture - Uses clean architecture to structure and abstract code, encouraging reusability.

  • Dagger-Hilt - Simplifies managing and providing dependencies which promotes modularity and testability.

  • Navigation Component - Simplifies screen transitions, handles navigation automatically to provide a consistent user experience.

  • ViewModel & LiveData - Presenter for persisting view state across config changes. LiveData is used to observe this state.

  • Kotlin Coroutines - Library support for coroutines, a lightweight framework for asynchronous programming in Kotlin.

  • Kotlin Flows - A reactive stream library in Kotlin for handling asynchronous data streams.

  • Room persistence library - Provides abstraction layer over SQLite for working with databases

  • Paging-3 - Library for retrieving data in chunks/pages from either network or database, database in this case.

  • ViewPager-2 - Used for creating swipeable screens and slide-based UIs in Android.

  • ViewPager Dot Indicator - Library that adds a stylish dot indicator to ViewPager screens, mostly for visual appeal.

  • Epoxy - Simplifies the creation of complex RecyclerView layouts by providing a more declarative approach. Great for handling dynamic data as well.

  • iText-PDF - Enables generation of PDF documents

  • Lottie Animations - Enables seamless integration of vector-based animations.

  • MP Charts - Powerful charting library for Android. Supports various chart types with extensive customization.

  • Alarm Manager - Android component for scheduling time-based tasks and events.

  • Braodcast Receiver - Used to listen for system-wide or app-specific events.

  • Splash Screen API - Provides a seamless and consistent way of applying splash screens in app.

  • Timber - Lightweight and flexible logging library.

  • Shared Preferences - Lightweight storage mechanism in Android for storing key-value pairs, such as user preferences, settings, and application state.

  • Preferences API - Convenient API for managing and persisting user preferences in Android applications, particularly in settings screens.

  • Firebase Crashlytics - A crash reporting tool for tracking and analyzing real-time app crashes.

  • Firebase Performance Monitor - A powerful tool for measuring, analyzing, and optimizing app performance.

Architecture/Flow

Spendr Architecture Flow

Screenshots

Onboarding Section

Splash screen Onboarding 1 screen Onboarding 2 screen Onboarding 3 screen

Home Screen

Home screen

Overview Section

Overview: Summary screen Income list screen Expenditure list screen

Activity Section

Activity - Expenditure tab screen Activity - Income tab screen

Budget Section

Budget screen Visualizer screen

Extras Section

Extras screen New reminder dialog screen New reminder - choose date screen New reminder choose time screen Reminder list screen

New Entry Section - Floating Action Button

New entry screen New entry - choose date screen New entry - choose category screen New entry - create category screen

Settings Section

Settings screen Delete reminders dialog screen Delete budget entries dialog screen

Spendr Application Flow Diagram

Spendr - Flow

ToDo

  • Modularize app (architecture)
  • Integrate receipt manager feature
  • Integrate a financial calculator feature‎

spendr's People

Stargazers

 avatar

Watchers

 avatar

spendr's Issues

Base Fragment

Use base fragment instead of repeated your code in every fragment just extend your fragment with base fragment below I'm sharing base fragment and call basefragment like below
class OnBoardingFragment : BaseFragment(FragmentOnBoardingBinding::inflate)
abstract class BaseFragment(
private val bindingInflater: (LayoutInflater, ViewGroup?, Boolean) -> B
) : Fragment() {

private var _binding: B? = null
val binding get() = _binding

open fun onViewBindingCreated(savedInstanceState: Bundle?) {}
open fun B.bindViews() {}
open fun B.bindListeners() {}
override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    _binding = bindingInflater.invoke(inflater, container, false)
    return _binding?.root
}


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    view.post {
        onViewBindingCreated(savedInstanceState)
        _binding?.let {
            it.bindViews()
            it.bindListeners()
        }

    }
}
fun navigate(direction: NavDirections) {
    isAlive {
        findNavController().navigate(direction)
    }
}
fun navigate(direction: Int) {
    isAlive {
        findNavController().navigate(direction)
    }
}

fun popBackStack() {
    isAlive {
        findNavController().popBackStack()
    }
}

fun popBackStack(destinationId: Int, inclusive: Boolean) {
    isAlive {
        findNavController().popBackStack(destinationId, inclusive)
    }
}

override fun onDestroyView() {
    super.onDestroyView()
    _binding = null
}

override fun onDestroy() {
    super.onDestroy()
    lifecycleScope.cancel()
}

}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.