├── lib
├── test.dart
├── data
│ ├── models
│ │ ├── category_details.dart
│ │ ├── home_tab.dart
│ │ ├── entry_list.dart
│ │ ├── category_with_entry_list.dart
│ │ ├── history.dart
│ │ ├── category_with_sum.dart
│ │ ├── entry_with_category.dart
│ │ ├── entry.dart
│ │ └── category.dart
│ ├── datasource
│ │ ├── sharedpref
│ │ │ ├── preferences.dart
│ │ │ └── shared_preference_helper.dart
│ │ ├── language_data.dart
│ │ ├── entry_dataSource.dart
│ │ └── local
│ │ │ └── moor
│ │ │ └── new_app_database.dart
│ └── repository
│ │ ├── entry_repository.dart
│ │ └── entry_repository_imp.dart
├── core
│ ├── routes.dart
│ ├── custom_scroll_physics.dart
│ ├── Logger.dart
│ ├── CrashReportingTree.dart
│ ├── color_scheme.dart
│ ├── date_time_util.dart
│ ├── currency_text_input_formatter.dart
│ ├── app_localization.dart
│ ├── theme.dart
│ └── constants.dart
├── extension
│ ├── icon_data_extension.dart
│ ├── string_extension.dart
│ ├── list_extension.dart
│ └── datetime_extension.dart
├── ui
│ ├── home
│ │ ├── home_state.dart
│ │ └── home.dart
│ ├── dialog
│ │ ├── common_alert_dialog.dart
│ │ ├── category_details_filter_dialog.dart
│ │ ├── history_filter_dialog.dart
│ │ ├── currency_dialog.dart
│ │ ├── language_dialog.dart
│ │ ├── theme_dialog.dart
│ │ └── monthly_cycle_date_dialog.dart
│ ├── setting
│ │ └── setting_view_model.dart
│ ├── category_list
│ │ ├── category_list_state.dart
│ │ └── category_list.dart
│ ├── dashboard
│ │ ├── chart_painter.dart
│ │ ├── category_list_view.dart
│ │ ├── pie_chart.dart
│ │ └── dashboard_state.dart
│ ├── history
│ │ ├── history_view_model.dart
│ │ ├── history.dart
│ │ ├── month_list.dart
│ │ ├── year_list.dart
│ │ └── entry_type.dart
│ ├── app
│ │ ├── app_state.dart
│ │ └── app.dart
│ ├── addCategory
│ │ └── addCategory_state.dart
│ └── addEntry
│ │ └── addEntry_state.dart
└── main.dart
├── ios
├── Runner
│ ├── Runner-Bridging-Header.h
│ ├── Assets.xcassets
│ │ ├── LaunchImage.imageset
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ ├── README.md
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-83.5x83.5@2x.png
│ │ │ └── Contents.json
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ ├── Main.storyboard
│ │ └── LaunchScreen.storyboard
│ └── Info.plist
├── Flutter
│ ├── Debug.xcconfig
│ ├── Release.xcconfig
│ └── AppFrameworkInfo.plist
├── Runner.xcodeproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ ├── WorkspaceSettings.xcsettings
│ │ │ └── IDEWorkspaceChecks.plist
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── WorkspaceSettings.xcsettings
│ │ └── IDEWorkspaceChecks.plist
├── Gemfile
├── fastlane
│ ├── Appfile
│ ├── Matchfile
│ └── Fastfile
├── .gitignore
└── Podfile
├── images
├── page_1.png
├── page_2.png
├── page_3.png
├── page_4.png
└── onboarding.gif
├── assets
├── images
│ ├── page_1.png
│ ├── page_2.png
│ ├── page_3.png
│ ├── expense_manage.png
│ └── add_expense_arrow.png
└── language
│ ├── en.json
│ ├── es.json
│ └── pt.json
├── android
├── android_keys.zip.gpg
├── gradle.properties
├── app
│ ├── src
│ │ ├── main
│ │ │ ├── res
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ │ └── ic_launcher.png
│ │ │ │ ├── drawable
│ │ │ │ │ └── launch_background.xml
│ │ │ │ └── values
│ │ │ │ │ └── styles.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── nividata
│ │ │ │ │ └── expense_manager
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── AndroidManifest.xml
│ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ └── profile
│ │ │ └── AndroidManifest.xml
│ └── build.gradle
├── fastlane
│ ├── Appfile
│ └── Fastfile
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
├── .gitignore
├── Gemfile
├── settings.gradle
└── build.gradle
├── .metadata
├── .github
├── scripts
│ └── decrypt_android_secrets.sh
└── workflows
│ ├── ios-build.yml
│ ├── android-build.yml
│ ├── ios-deployment.yml
│ └── android-deployment.yml
├── LICENSE
├── test
└── widget_test.dart
├── README.md
├── .gitignore
└── pubspec.yaml
/lib/test.dart:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/lib/data/models/category_details.dart:
--------------------------------------------------------------------------------
1 | class CategoryDetails {}
2 |
--------------------------------------------------------------------------------
/lib/data/models/home_tab.dart:
--------------------------------------------------------------------------------
1 | enum HomeTab { dashboard, history }
2 |
--------------------------------------------------------------------------------
/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
2 |
--------------------------------------------------------------------------------
/images/page_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/images/page_1.png
--------------------------------------------------------------------------------
/images/page_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/images/page_2.png
--------------------------------------------------------------------------------
/images/page_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/images/page_3.png
--------------------------------------------------------------------------------
/images/page_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/images/page_4.png
--------------------------------------------------------------------------------
/images/onboarding.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/images/onboarding.gif
--------------------------------------------------------------------------------
/assets/images/page_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/assets/images/page_1.png
--------------------------------------------------------------------------------
/assets/images/page_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/assets/images/page_2.png
--------------------------------------------------------------------------------
/assets/images/page_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/assets/images/page_3.png
--------------------------------------------------------------------------------
/android/android_keys.zip.gpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/android/android_keys.zip.gpg
--------------------------------------------------------------------------------
/assets/images/expense_manage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/assets/images/expense_manage.png
--------------------------------------------------------------------------------
/assets/images/add_expense_arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/assets/images/add_expense_arrow.png
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.useAndroidX=true
3 | android.enableJetifier=true
4 | android.enableR8=true
5 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
2 | #include "Generated.xcconfig"
3 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jaysavsani07/expense-manager/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/kotlin/com/nividata/expense_manager/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.nividata.expense_manager
2 |
3 | import io.flutter.embedding.android.FlutterActivity
4 |
5 | class MainActivity: FlutterActivity() {
6 | }
7 |
--------------------------------------------------------------------------------
/android/fastlane/Appfile:
--------------------------------------------------------------------------------
1 | json_key_file("service_account_key.json") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one
2 | package_name("com.nividata.expense_manager") # e.g. com.krausefx.app
3 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
7 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
9 | # Remember to never publicly share your keystore.
10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
11 | key.properties
12 |
--------------------------------------------------------------------------------
/lib/data/datasource/sharedpref/preferences.dart:
--------------------------------------------------------------------------------
1 | class Preferences {
2 | static const USER_NAME = "userName";
3 | static const IS_DARK_MODE = "isDarkMode";
4 | static const DEFAULT_LANGUAGE = "defaultLanguage";
5 | static const DEFAULT_CURRENCY = "defaultCurrency";
6 | static const MONTH_CYCLE_DATE = "monthCycleDate";
7 | }
8 |
--------------------------------------------------------------------------------
/ios/Gemfile:
--------------------------------------------------------------------------------
1 | source "https://rubygems.org"
2 |
3 | gem "fastlane"
4 |
5 | # Add this plugin
6 | gem "fastlane-plugin-flutter_version", git: "https://github.com/tianhaoz95/fastlane-plugin-flutter-version"
7 | plugins_path = File.join(File.dirname(__FILE__), '.', 'Pluginfile')
8 | eval_gemfile(plugins_path) if File.exist?(plugins_path)
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PreviewsEnabled
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 84f3d28555368a70270e9ac8390a9441df95e752
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/android/Gemfile:
--------------------------------------------------------------------------------
1 | source "https://rubygems.org"
2 |
3 | gem "fastlane"
4 |
5 | # Add this plugin to retrieve version code for flutter
6 | gem "fastlane-plugin-flutter_version", git: "https://github.com/tianhaoz95/fastlane-plugin-flutter-version"
7 | plugins_path = File.join(File.dirname(__FILE__), '.', 'Pluginfile')
8 | eval_gemfile(plugins_path) if File.exist?(plugins_path)
9 |
--------------------------------------------------------------------------------
/ios/fastlane/Appfile:
--------------------------------------------------------------------------------
1 | app_identifier("com.nividata.expensemanager") # The bundle identifier of your app
2 | apple_id("nividataapps@gmail.com") # Your Apple email address
3 |
4 | itc_team_id("120740426") # App Store Connect Team ID
5 | team_id("UJMS4XPZSS") # Developer Portal Team ID
6 |
7 | # For more information about the Appfile, see:
8 | # https://docs.fastlane.tools/advanced/#appfile
9 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/lib/core/routes.dart:
--------------------------------------------------------------------------------
1 | class AppRoutes {
2 | static final welcome = '/welcome';
3 | static final onBoarding = '/onBoarding';
4 | static final home = '/home';
5 | static final addEntry = '/addEntry';
6 | static final categoryList = '/categoryList';
7 | static final addCategory = '/addCategory';
8 | static final categoryDetails = '/categoryDetails';
9 | static final setting = '/setting';
10 | }
11 |
--------------------------------------------------------------------------------
/lib/extension/icon_data_extension.dart:
--------------------------------------------------------------------------------
1 | import 'dart:convert';
2 |
3 | import 'package:flutter/material.dart';
4 |
5 | extension IconDataExtension on IconData {
6 | String iconDataToJson() => jsonEncode({
7 | 'codePoint': this.codePoint,
8 | 'fontFamily': this.fontFamily,
9 | 'fontPackage': this.fontPackage,
10 | 'matchTextDirection': this.matchTextDirection
11 | });
12 | }
13 |
--------------------------------------------------------------------------------
/lib/extension/string_extension.dart:
--------------------------------------------------------------------------------
1 | import 'dart:convert';
2 |
3 | import 'package:flutter/cupertino.dart';
4 |
5 | extension StringExtension on String {
6 | IconData jsonToIconData() {
7 | Map map = jsonDecode(this);
8 | return IconData(
9 | map['codePoint'],
10 | fontFamily: map['fontFamily'],
11 | fontPackage: map['fontPackage'],
12 | matchTextDirection: map['matchTextDirection'],
13 | );
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
4 | def properties = new Properties()
5 |
6 | assert localPropertiesFile.exists()
7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
8 |
9 | def flutterSdkPath = properties.getProperty("flutter.sdk")
10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
12 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/lib/data/models/entry_list.dart:
--------------------------------------------------------------------------------
1 | import 'package:expense_manager/data/models/entry.dart';
2 |
3 | class EntryList {
4 | final String title;
5 | final List list;
6 |
7 | EntryList({
8 | required this.title,
9 | required this.list,
10 | });
11 |
12 | EntryList copyWith({
13 | String? title,
14 | List? list,
15 | }) {
16 | return EntryList(title: title ?? this.title, list: list ?? this.list);
17 | }
18 |
19 | @override
20 | String toString() {
21 | return 'EntryList{title: $title, list: $list}';
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/ios/fastlane/Matchfile:
--------------------------------------------------------------------------------
1 | git_url("https://github.com/nividata-consultancy/certificates-ios.git")
2 |
3 | storage_mode("git")
4 |
5 | type("development") # The default type, can be: appstore, adhoc, enterprise or development
6 | type("appstore")
7 |
8 | # app_identifier(["tools.fastlane.app", "tools.fastlane.app2"])
9 | # username("user@fastlane.tools") # Your Apple Developer Portal username
10 |
11 | # For all available options run `fastlane match --help`
12 | # Remove the # in the beginning of the line to enable the other options
13 |
14 | # The docs are available on https://docs.fastlane.tools/actions/match
15 |
--------------------------------------------------------------------------------
/lib/ui/home/home_state.dart:
--------------------------------------------------------------------------------
1 | import 'package:expense_manager/data/models/home_tab.dart';
2 | import 'package:flutter/foundation.dart';
3 | import 'package:flutter_riverpod/flutter_riverpod.dart';
4 |
5 | final signInModelProvider = ChangeNotifierProvider(
6 | (ref) => HomeViewModel(),
7 | );
8 |
9 | class HomeViewModel with ChangeNotifier {
10 | HomeTab activeTab = HomeTab.dashboard;
11 |
12 | changeTab(int index) {
13 | if (index == 0) {
14 | activeTab = HomeTab.dashboard;
15 | } else {
16 | activeTab = HomeTab.history;
17 | }
18 | notifyListeners();
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/lib/extension/list_extension.dart:
--------------------------------------------------------------------------------
1 | import 'package:expense_manager/data/models/entry_with_category.dart';
2 |
3 | extension ListExtension on List {
4 | Map> groupListsByMonth(int currentMonth) {
5 | var result = >{};
6 |
7 | for (int i = 1; i <= currentMonth; i++) {
8 | result[i] = [];
9 | }
10 | for (var element in this) {
11 | if (element.entry.modifiedDate.month <= currentMonth)
12 | (result[element.entry.modifiedDate.month])!..add(element);
13 | }
14 | return result;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/lib/core/custom_scroll_physics.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class CustomScrollPhysics extends PageScrollPhysics {
4 | const CustomScrollPhysics({ScrollPhysics? parent}) : super(parent: parent);
5 |
6 | @override
7 | double get minFlingVelocity => 0.01;
8 |
9 | @override
10 | double get maxFlingVelocity => 0.7;
11 |
12 | @override
13 | double get minFlingDistance => 12;
14 |
15 | @override
16 | double get dragStartDistanceMotionThreshold => 40;
17 |
18 | @override
19 | CustomScrollPhysics applyTo(ScrollPhysics? ancestor) {
20 | return CustomScrollPhysics(parent: buildParent(ancestor));
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/.github/scripts/decrypt_android_secrets.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | # --batch to prevent interactive command
4 | # --yes to assume "yes" for questions
5 | gpg --quiet --batch --yes --decrypt --passphrase="$ANDROID_KEYS_SECRET_PASSPHRASE" \
6 | --output android/android_keys.zip android/android_keys.zip.gpg && cd android && jar xvf android_keys.zip && cd -
7 | echo $PWD
8 |
9 | echo "********1"
10 | ls -d $PWD/android/*
11 | mv ./android/expensemanager.jks ./android/app
12 | mv ./android/google-services.json ./android/app
13 | echo ./
14 | echo "********2"
15 | FILE=./android/app/expensemanager.jks
16 | if test -f "$FILE"; then
17 | echo "$FILE exists."
18 | fi
19 |
--------------------------------------------------------------------------------
/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/lib/ui/dialog/common_alert_dialog.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class CommonAlertDialog extends AlertDialog {
4 | final Widget child;
5 |
6 | CommonAlertDialog({required this.child}) : super();
7 |
8 | @override
9 | Widget build(BuildContext context) {
10 | return Align(
11 | alignment: Alignment.topCenter,
12 | child: Padding(
13 | padding: const EdgeInsets.only(
14 | left: 24, right: 24, top: kToolbarHeight + 12),
15 | child: Material(
16 | shape: RoundedRectangleBorder(
17 | borderRadius: BorderRadius.all(Radius.circular(14))),
18 | child: child,
19 | ),
20 | ),
21 | );
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/lib/data/datasource/language_data.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/cupertino.dart';
2 |
3 | class Language {
4 | final int id;
5 | final String name;
6 | final String flag;
7 | final Locale locale;
8 |
9 | Language({
10 | required this.id,
11 | required this.name,
12 | required this.flag,
13 | required this.locale,
14 | });
15 |
16 | static List languageList() {
17 | return [
18 | Language(
19 | id: 1, name: "English", flag: "🇺🇸", locale: Locale('en', 'US')),
20 | Language(
21 | id: 2, name: "Spanish", flag: "🇪🇸", locale: Locale('es', 'ES')),
22 | Language(
23 | id: 3, name: "Portuguese", flag: "🇧🇷", locale: Locale('pt', 'BR')),
24 | ];
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/lib/core/Logger.dart:
--------------------------------------------------------------------------------
1 | import 'package:fimber/fimber.dart';
2 | import 'package:flutter_riverpod/flutter_riverpod.dart';
3 |
4 | class Logger extends ProviderObserver {
5 | @override
6 | void didUpdateProvider(
7 | ProviderBase provider,
8 | Object? previousValue,
9 | Object? newValue,
10 | ProviderContainer container,
11 | ) {
12 | // print('''
13 | // {
14 | // "provider": "${provider.name ?? provider.runtimeType}",
15 | // "newValue": "$newValue"
16 | // }''');
17 | }
18 |
19 | @override
20 | void providerDidFail(ProviderBase