main c886e0fce272 cached
141 files
408.3 KB
99.9k tokens
307 symbols
1 requests
Download .txt
Showing preview only (455K chars total). Download the full file or copy to clipboard to get everything.
Repository: floranguyen0/mmas-money-tracker
Branch: main
Commit: c886e0fce272
Files: 141
Total size: 408.3 KB

Directory structure:
gitextract_sxwtmaf3/

├── .gitignore
├── .metadata
├── LICENSE
├── README.md
├── android/
│   ├── .gitignore
│   ├── app/
│   │   ├── build.gradle
│   │   └── src/
│   │       ├── debug/
│   │       │   └── AndroidManifest.xml
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── kotlin/
│   │       │   │   └── com/
│   │       │   │       └── mmas/
│   │       │   │           └── money_assistant_2608/
│   │       │   │               └── MainActivity.kt
│   │       │   └── res/
│   │       │       ├── drawable/
│   │       │       │   └── launch_background.xml
│   │       │       ├── drawable-v21/
│   │       │       │   └── launch_background.xml
│   │       │       ├── values/
│   │       │       │   └── styles.xml
│   │       │       └── values-night/
│   │       │           └── styles.xml
│   │       └── profile/
│   │           └── AndroidManifest.xml
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   └── settings.gradle
├── flutter
├── ios/
│   ├── .gitignore
│   ├── Flutter/
│   │   ├── AppFrameworkInfo.plist
│   │   ├── Debug.xcconfig
│   │   └── Release.xcconfig
│   ├── Podfile
│   ├── Runner/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   ├── AppIcon.appiconset/
│   │   │   │   └── Contents.json
│   │   │   ├── LaunchBackground.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── LaunchImage.imageset/
│   │   │       ├── Contents.json
│   │   │       └── README.md
│   │   ├── Base.lproj/
│   │   │   ├── LaunchScreen.storyboard
│   │   │   └── Main.storyboard
│   │   ├── GoogleService-Info.plist
│   │   ├── Info.plist
│   │   ├── Runner-Bridging-Header.h
│   │   └── Runner.entitlements
│   ├── Runner.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   ├── contents.xcworkspacedata
│   │   │   └── xcshareddata/
│   │   │       ├── IDEWorkspaceChecks.plist
│   │   │       └── WorkspaceSettings.xcsettings
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           └── Runner.xcscheme
│   ├── Runner.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── WorkspaceSettings.xcsettings
│   └── build/
│       └── Pods.build/
│           └── Release-iphonesimulator/
│               ├── DKImagePickerController-DKImagePickerController.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── DKImagePickerController.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── DKPhotoGallery-DKPhotoGallery.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── DKPhotoGallery.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── FMDB.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── Flutter.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── Pods-Runner.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── SDWebImage.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── SwiftyGif.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── Toast.build/
│               │   └── dgph
│               ├── file_picker.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── fluttertoast.build/
│               │   └── dgph
│               ├── in_app_review.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── local_auth.build/
│               │   └── dgph
│               ├── path_provider.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── rate_my_app.build/
│               │   └── dgph
│               ├── share_plus.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── shared_preferences.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── sqflite.build/
│               │   ├── dgph
│               │   └── dgph~
│               └── url_launcher.build/
│                   ├── dgph
│                   └── dgph~
├── lib/
│   ├── main.dart
│   └── project/
│       ├── app_pages/
│       │   ├── add_category.dart
│       │   ├── analysis.dart
│       │   ├── calendar.dart
│       │   ├── currency.dart
│       │   ├── edit.dart
│       │   ├── edit_expense_category.dart
│       │   ├── edit_income_category.dart
│       │   ├── expense_category.dart
│       │   ├── income_category.dart
│       │   ├── input.dart
│       │   ├── others.dart
│       │   ├── parent_category.dart
│       │   ├── report.dart
│       │   ├── select_date_format.dart
│       │   ├── select_icon.dart
│       │   └── select_language.dart
│       ├── auth_pages/
│       │   ├── loading_page.dart
│       │   ├── sign_in.dart
│       │   ├── sign_up.dart
│       │   ├── user_account.dart
│       │   ├── welcome_page.dart
│       │   └── wrapper.dart
│       ├── auth_services/
│       │   └── firebase_authentication.dart
│       ├── classes/
│       │   ├── alert_dialog.dart
│       │   ├── app_bar.dart
│       │   ├── category_item.dart
│       │   ├── chart_pie.dart
│       │   ├── constants.dart
│       │   ├── custom_toast.dart
│       │   ├── dropdown_box.dart
│       │   ├── icons.dart
│       │   ├── input_model.dart
│       │   ├── keyboard.dart
│       │   ├── lockscreen.dart
│       │   └── saveOrSaveAndDeleteButtons.dart
│       ├── database_management/
│       │   ├── database.dart
│       │   ├── shared_preferences_services.dart
│       │   └── sqflite_services.dart
│       ├── draft1.dart
│       ├── home.dart
│       ├── localization/
│       │   ├── app_localization.dart
│       │   ├── lang/
│       │   │   ├── ar.json
│       │   │   ├── de.json
│       │   │   ├── en.json
│       │   │   ├── es.json
│       │   │   ├── fr.json
│       │   │   ├── hi.json
│       │   │   ├── ja.json
│       │   │   ├── ko.json
│       │   │   ├── ne.json
│       │   │   ├── pt.json
│       │   │   ├── ru.json
│       │   │   ├── tr.json
│       │   │   ├── vi.json
│       │   │   └── zh.json
│       │   ├── language.dart
│       │   └── methods.dart
│       ├── provider.dart
│       └── real_main.dart
├── pubspec.yaml
└── test/
    └── widget_test.dart

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/

# IntelliJ related
*.iml
*.ipr
*.iws
.idea/

# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/

# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
/build/

# Web related
lib/generated_plugin_registrant.dart

# Symbolication related
app.*.symbols

# Obfuscation related
app.*.map.json

# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release




================================================
FILE: .metadata
================================================
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.

version:
  revision: f4abaa0735eba4dfd8f33f73363911d63931fe03
  channel: stable

project_type: app


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2021 Hoa Nguyen

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# MMAS: Money Tracker

> An optimized application for daily expense tracking and finance management. <br />

![MMAS (820 x 360 px)](https://user-images.githubusercontent.com/72301141/206877824-90492e92-2e2d-4de6-b23c-312f283bdfd6.png)


## Setup

Run the following commands from your terminal:

1) `git clone https://github.com/floranguyen0/mmas-money-tracker` to clone this repository 

2) `flutter pub get` in the project root directory to install all the required dependencies.


## Download MMAS at:

https://apps.apple.com/vn/app/mmas-money-tracker/id1582638369


## Screenshots

<table width="100%">
  <tbody>
    <tr>
      <td width="1%"><img src="https://user-images.githubusercontent.com/72301141/206411105-4a64ada8-2a9c-4804-ad59-59302a6a82c5.jpg"/></td>
      <td width="1%"><img src="https://user-images.githubusercontent.com/72301141/206417378-9da25e84-bf21-401c-bf23-bce3b352311e.jpg"/></td>
       <td width="1%"><img src="https://user-images.githubusercontent.com/72301141/206417548-787625af-f4b1-4c9d-8aac-fa9bd7c47bfb.jpg"/></td>
    </tr>
    <tr>
      <td width="1%"><img src="https://user-images.githubusercontent.com/72301141/206417565-01bc0f8c-27a4-4648-a845-0a7c29a957c2.jpg"/></td>
      <td width="1%"><img src="https://user-images.githubusercontent.com/72301141/206417707-be626efa-6bed-41be-a932-4e7a5aa22039.jpg"/></td>
       <td width="1%"><img src="https://user-images.githubusercontent.com/72301141/206417743-8a51d828-efe0-4d3e-9f6b-5b16a4f3b086.jpg"/></td>
    </tr>
    <tr>
      <td width="1%"><img src="https://user-images.githubusercontent.com/72301141/206417756-a979fefe-23f8-4a21-bfa5-7e45745c19f0.jpg"/></td>
      <td width="1%"><img src="https://user-images.githubusercontent.com/72301141/206417834-25dc5bb4-c099-4d90-81a6-eb4e469bc40e.jpg"/></td>
       <td width="1%"><img src="https://user-images.githubusercontent.com/72301141/206417851-2ee18113-04bf-48ae-bf83-d377b4517742.jpg"/></td>
    </tr>
  </tbody>
</table>


## LICENSE
MMAS: Money Tracker is [MIT-licensed](https://github.com/floranguyen0/mmas-money-tracker/blob/main/LICENSE).


================================================
FILE: android/.gitignore
================================================
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java

# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
app/upload-keystore.jks


================================================
FILE: android/app/build.gradle
================================================
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"


def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}


android {
    compileSdkVersion 30

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.mmas.money_assistant_2608"
        minSdkVersion 16
        targetSdkVersion 33
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
            storePassword keystoreProperties['storePassword']
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}


================================================
FILE: android/app/src/debug/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mmas.money_assistant_2608">
    <!-- Flutter needs it to communicate with the running application
         to allow setting breakpoints, to provide hot reload, etc.
    -->
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>


================================================
FILE: android/app/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mmas.money_assistant_2608">
   <application
        android:label="MMAS"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <!-- Displays an Android View that continues showing the launch screen
                 Drawable until Flutter paints its first frame, then this splash
                 screen fades out. A splash screen is useful to avoid any visual
                 gap between the end of Android's launch screen and the painting of
                 Flutter's first frame. -->
            <meta-data
              android:name="io.flutter.embedding.android.SplashScreenDrawable"
              android:resource="@drawable/launch_background"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
</manifest>


================================================
FILE: android/app/src/main/kotlin/com/mmas/money_assistant_2608/MainActivity.kt
================================================
package com.mmas.money_assistant_2608

import io.flutter.embedding.android.FlutterActivity

class MainActivity: FlutterActivity() {
}


================================================
FILE: android/app/src/main/res/drawable/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <bitmap android:gravity="fill" android:src="@drawable/background"/>
    </item>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/splash"/>
    </item>
</layer-list>

================================================
FILE: android/app/src/main/res/drawable-v21/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <bitmap android:gravity="fill" android:src="@drawable/background"/>
    </item>
    <item>
        <bitmap android:gravity="center" android:src="@drawable/splash"/>
    </item>
</layer-list>

================================================
FILE: android/app/src/main/res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
    <style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <!-- Show a splash screen on the activity. Automatically removed when
             Flutter draws its first frame -->
        <item name="android:windowBackground">@drawable/launch_background</item>
        <item name="android:windowFullscreen">false</item>
    </style>
    <!-- Theme applied to the Android Window as soon as the process has started.
         This theme determines the color of the Android Window while your
         Flutter UI initializes, as well as behind your Flutter UI while its
         running.
         
         This Theme is only used starting with V2 of Flutter's Android embedding. -->
    <style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
    </style>
</resources>

================================================
FILE: android/app/src/main/res/values-night/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
    <style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <!-- Show a splash screen on the activity. Automatically removed when
             Flutter draws its first frame -->
        <item name="android:windowBackground">@drawable/launch_background</item>
        <item name="android:windowFullscreen">false</item>
    </style>
    <!-- Theme applied to the Android Window as soon as the process has started.
         This theme determines the color of the Android Window while your
         Flutter UI initializes, as well as behind your Flutter UI while its
         running.
         
         This Theme is only used starting with V2 of Flutter's Android embedding. -->
    <style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
        <item name="android:windowBackground">?android:colorBackground</item>
    </style>
</resources>

================================================
FILE: android/app/src/profile/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mmas.money_assistant_2608">
    <!-- Flutter needs it to communicate with the running application
         to allow setting breakpoints, to provide hot reload, etc.
    -->
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>


================================================
FILE: android/build.gradle
================================================
buildscript {
    ext.kotlin_version = '1.8.0'
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
    project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: android/gradle/wrapper/gradle-wrapper.properties
================================================
#Fri Jun 23 08:50:38 CEST 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip


================================================
FILE: android/gradle.properties
================================================
#org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
org.gradle.java.home=C:/Program Files/Java/jdk-19
org.gradle.jvmargs=--add-opens java.base/java.io=ALL-UNNAMED

================================================
FILE: android/settings.gradle
================================================
include ':app'

def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
def properties = new Properties()

assert localPropertiesFile.exists()
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }

def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"


================================================
FILE: flutter
================================================


================================================
FILE: ios/.gitignore
================================================
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*

# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3


================================================
FILE: ios/Flutter/AppFrameworkInfo.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleDevelopmentRegion</key>
  <string>en</string>
  <key>CFBundleExecutable</key>
  <string>App</string>
  <key>CFBundleIdentifier</key>
  <string>io.flutter.flutter.app</string>
  <key>CFBundleInfoDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundleName</key>
  <string>App</string>
  <key>CFBundlePackageType</key>
  <string>FMWK</string>
  <key>CFBundleShortVersionString</key>
  <string>1.0</string>
  <key>CFBundleSignature</key>
  <string>????</string>
  <key>CFBundleVersion</key>
  <string>1.0</string>
  <key>MinimumOSVersion</key>
  <string>9.0</string>
</dict>
</plist>


================================================
FILE: ios/Flutter/Debug.xcconfig
================================================
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"


================================================
FILE: ios/Flutter/Release.xcconfig
================================================
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"


================================================
FILE: ios/Podfile
================================================
# Uncomment this line to define a global platform for your project
platform :ios, '9.0'

# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'

project 'Runner', {
  'Debug' => :debug,
  'Profile' => :release,
  'Release' => :release,
}

def flutter_root
  generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
  unless File.exist?(generated_xcode_build_settings_path)
    raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
  end

  File.foreach(generated_xcode_build_settings_path) do |line|
    matches = line.match(/FLUTTER_ROOT\=(.*)/)
    return matches[1].strip if matches
  end
  raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end

require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)

flutter_ios_podfile_setup

target 'Runner' do
  use_frameworks!
  use_modular_headers!

  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
  end
end


================================================
FILE: ios/Runner/AppDelegate.swift
================================================
import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}


================================================
FILE: ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"72x72","expected-size":"72","filename":"72.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"76x76","expected-size":"152","filename":"152.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"50x50","expected-size":"100","filename":"100.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"76x76","expected-size":"76","filename":"76.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"50x50","expected-size":"50","filename":"50.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"72x72","expected-size":"144","filename":"144.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"40x40","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"83.5x83.5","expected-size":"167","filename":"167.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"},{"size":"20x20","expected-size":"20","filename":"20.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"1x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"ipad","scale":"2x"}]}

================================================
FILE: ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json
================================================
{
  "images" : [
    {
      "filename" : "background.png",
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
================================================
{
  "images" : [
    {
      "filename" : "LaunchImage.png",
      "idiom" : "universal",
      "scale" : "1x"
    },
    {
      "filename" : "LaunchImage@2x.png",
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "filename" : "LaunchImage@3x.png",
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
================================================
# Launch Screen Assets

You can customize the launch screen with your own desired assets by replacing the image files in this directory.

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.

================================================
FILE: ios/Runner/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="EHf-IW-A2E">
            <objects>
                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
                        <viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" image="LaunchBackground" translatesAutoresizingMaskIntoConstraints="NO" id="tWc-Dq-wcI"/>
                            <imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4"></imageView>
                        </subviews>
                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <constraints>
                            <constraint firstItem="YRO-k0-Ey4" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="3T2-ad-Qdv"/>
                            <constraint firstItem="tWc-Dq-wcI" firstAttribute="bottom" secondItem="Ze5-6b-2t3" secondAttribute="bottom" id="RPx-PI-7Xg"/>
                            <constraint firstItem="tWc-Dq-wcI" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="SdS-ul-q2q"/>
                            <constraint firstAttribute="trailing" secondItem="tWc-Dq-wcI" secondAttribute="trailing" id="Swv-Gf-Rwn"/>
                            <constraint firstAttribute="trailing" secondItem="YRO-k0-Ey4" secondAttribute="trailing" id="TQA-XW-tRk"/>
                            <constraint firstItem="YRO-k0-Ey4" firstAttribute="bottom" secondItem="Ze5-6b-2t3" secondAttribute="bottom" id="duK-uY-Gun"/>
                            <constraint firstItem="tWc-Dq-wcI" firstAttribute="leading" secondItem="Ze5-6b-2t3" secondAttribute="leading" id="kV7-tw-vXt"/>
                            <constraint firstItem="YRO-k0-Ey4" firstAttribute="top" secondItem="Ze5-6b-2t3" secondAttribute="top" id="xPn-NY-SIU"/>
                        </constraints>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="53" y="375"/>
        </scene>
    </scenes>
    <resources>
        <image name="LaunchImage" width="256" height="256"/>
        <image name="LaunchBackground" width="1" height="1"/>
    </resources>
</document>

================================================
FILE: ios/Runner/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
    </dependencies>
    <scenes>
        <!--Flutter View Controller-->
        <scene sceneID="tne-QT-ifu">
            <objects>
                <viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
                        <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
                        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
            </objects>
        </scene>
    </scenes>
</document>


================================================
FILE: ios/Runner/GoogleService-Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CLIENT_ID</key>
	<string>189781709351-2fgub7ut4f44e7seqvdgaebid05e8mgd.apps.googleusercontent.com</string>
	<key>REVERSED_CLIENT_ID</key>
	<string>com.googleusercontent.apps.189781709351-2fgub7ut4f44e7seqvdgaebid05e8mgd</string>
	<key>API_KEY</key>
	<string>AIzaSyC_4qm52Vkak1c_a-WucmgTY1GLhQvIp-g</string>
	<key>GCM_SENDER_ID</key>
	<string>189781709351</string>
	<key>PLIST_VERSION</key>
	<string>1</string>
	<key>BUNDLE_ID</key>
	<string>com.example.moneyAssistant2608</string>
	<key>PROJECT_ID</key>
	<string>mmas-moneytracker</string>
	<key>STORAGE_BUCKET</key>
	<string>mmas-moneytracker.appspot.com</string>
	<key>IS_ADS_ENABLED</key>
	<false></false>
	<key>IS_ANALYTICS_ENABLED</key>
	<false></false>
	<key>IS_APPINVITE_ENABLED</key>
	<true></true>
	<key>IS_GCM_ENABLED</key>
	<true></true>
	<key>IS_SIGNIN_ENABLED</key>
	<true></true>
	<key>GOOGLE_APP_ID</key>
	<string>1:189781709351:ios:53aeb605dc2b087285b402</string>
</dict>
</plist>

================================================
FILE: ios/Runner/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>en-US</string>
	<key>CFBundleDisplayName</key>
	<string>MMAS</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleLocalizations</key>
	<array>
		<string>en</string>
		<string>zh</string>
		<string>zh_CN</string>
		<string>fr</string>
		<string>de</string>
		<string>ja</string>
		<string>ko</string>
	</array>
	<key>CFBundleName</key>
	<string>MMAS</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>$(FLUTTER_BUILD_NAME)</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>$(FLUTTER_BUILD_NUMBER)</string>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>NSPhotoLibraryUsageDescription</key>
	<string>We access your photo library to add a photo of your bills to your expense/income records</string>
	<key>UILaunchStoryboardName</key>
	<string>LaunchScreen</string>
	<key>UIMainStoryboardFile</key>
	<string>Main</string>
	<key>UIStatusBarHidden</key>
	<false/>
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>UIViewControllerBasedStatusBarAppearance</key>
	<false/>
</dict>
</plist>


<!-- Google Sign-In section -->
<key>CFBundleURLTypes</key>
<array>
	<dict>
		<key>CFBundleTypeRole</key>
		<string>Editor</string>
		<key>CFBundleURLSchemes</key>
		<array>
			<string>com.googleusercontent.apps.189781709351-2fgub7ut4f44e7seqvdgaebid05e8mgd</string>
		</array>
	</dict>
</array>
<!-- End of the Google Sign-In section -->


================================================
FILE: ios/Runner/Runner-Bridging-Header.h
================================================
#import "GeneratedPluginRegistrant.h"


================================================
FILE: ios/Runner/Runner.entitlements
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>aps-environment</key>
	<string>development</string>
</dict>
</plist>


================================================
FILE: ios/Runner.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
	archiveVersion = 1;
	classes = {
	};
	objectVersion = 51;
	objects = {

/* Begin PBXBuildFile section */
		1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
		23D73B63272C62B1009E72A7 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 23D73B62272C62B1009E72A7 /* GoogleService-Info.plist */; };
		3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
		61499E5D1D041FF00E95B707 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B99D98016620F7A28ACDC882 /* Pods_Runner.framework */; };
		74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
		97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
		97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */

/* Begin PBXCopyFilesBuildPhase section */
		9705A1C41CF9048500538489 /* Embed Frameworks */ = {
			isa = PBXCopyFilesBuildPhase;
			buildActionMask = 2147483647;
			dstPath = "";
			dstSubfolderSpec = 10;
			files = (
			);
			name = "Embed Frameworks";
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
		1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
		1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
		23D73B62272C62B1009E72A7 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
		23E42C6126E530110040CEF6 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
		3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
		3CAD1B05AD9D13F3D49A238F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
		6F42B7B7C5C3973C91F87BBA /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
		74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
		74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
		7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
		9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
		9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
		97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
		97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
		97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
		97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
		97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		B99D98016620F7A28ACDC882 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
		B9A5FB7A6583188949FF87EB /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
		97C146EB1CF9000F007C117D /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				61499E5D1D041FF00E95B707 /* Pods_Runner.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
		5A2F1614F901E5E08066321B /* Frameworks */ = {
			isa = PBXGroup;
			children = (
				B99D98016620F7A28ACDC882 /* Pods_Runner.framework */,
			);
			name = Frameworks;
			sourceTree = "<group>";
		};
		9740EEB11CF90186004384FC /* Flutter */ = {
			isa = PBXGroup;
			children = (
				3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
				9740EEB21CF90195004384FC /* Debug.xcconfig */,
				7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
				9740EEB31CF90195004384FC /* Generated.xcconfig */,
			);
			name = Flutter;
			sourceTree = "<group>";
		};
		97C146E51CF9000F007C117D = {
			isa = PBXGroup;
			children = (
				9740EEB11CF90186004384FC /* Flutter */,
				97C146F01CF9000F007C117D /* Runner */,
				97C146EF1CF9000F007C117D /* Products */,
				E1BD7345BC0DA67D9B5D118F /* Pods */,
				5A2F1614F901E5E08066321B /* Frameworks */,
			);
			sourceTree = "<group>";
		};
		97C146EF1CF9000F007C117D /* Products */ = {
			isa = PBXGroup;
			children = (
				97C146EE1CF9000F007C117D /* Runner.app */,
			);
			name = Products;
			sourceTree = "<group>";
		};
		97C146F01CF9000F007C117D /* Runner */ = {
			isa = PBXGroup;
			children = (
				23D73B62272C62B1009E72A7 /* GoogleService-Info.plist */,
				23E42C6126E530110040CEF6 /* Runner.entitlements */,
				97C146FA1CF9000F007C117D /* Main.storyboard */,
				97C146FD1CF9000F007C117D /* Assets.xcassets */,
				97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
				97C147021CF9000F007C117D /* Info.plist */,
				1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
				1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
				74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
				74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
			);
			path = Runner;
			sourceTree = "<group>";
		};
		E1BD7345BC0DA67D9B5D118F /* Pods */ = {
			isa = PBXGroup;
			children = (
				B9A5FB7A6583188949FF87EB /* Pods-Runner.debug.xcconfig */,
				3CAD1B05AD9D13F3D49A238F /* Pods-Runner.release.xcconfig */,
				6F42B7B7C5C3973C91F87BBA /* Pods-Runner.profile.xcconfig */,
			);
			path = Pods;
			sourceTree = "<group>";
		};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
		97C146ED1CF9000F007C117D /* Runner */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
			buildPhases = (
				79D9EC2F681B8FDF039DE67A /* [CP] Check Pods Manifest.lock */,
				9740EEB61CF901F6004384FC /* Run Script */,
				97C146EA1CF9000F007C117D /* Sources */,
				97C146EB1CF9000F007C117D /* Frameworks */,
				97C146EC1CF9000F007C117D /* Resources */,
				9705A1C41CF9048500538489 /* Embed Frameworks */,
				3B06AD1E1E4923F5004D2608 /* Thin Binary */,
				D1539A2B591CC9A875AC7664 /* [CP] Embed Pods Frameworks */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = Runner;
			productName = Runner;
			productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
			productType = "com.apple.product-type.application";
		};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
		97C146E61CF9000F007C117D /* Project object */ = {
			isa = PBXProject;
			attributes = {
				LastUpgradeCheck = 1020;
				ORGANIZATIONNAME = "";
				TargetAttributes = {
					97C146ED1CF9000F007C117D = {
						CreatedOnToolsVersion = 7.3.1;
						LastSwiftMigration = 1100;
					};
				};
			};
			buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
			compatibilityVersion = "Xcode 9.3";
			developmentRegion = en;
			hasScannedForEncodings = 0;
			knownRegions = (
				en,
				Base,
			);
			mainGroup = 97C146E51CF9000F007C117D;
			productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
			projectDirPath = "";
			projectRoot = "";
			targets = (
				97C146ED1CF9000F007C117D /* Runner */,
			);
		};
/* End PBXProject section */

/* Begin PBXResourcesBuildPhase section */
		97C146EC1CF9000F007C117D /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
				3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
				23D73B63272C62B1009E72A7 /* GoogleService-Info.plist in Resources */,
				97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
				97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXResourcesBuildPhase section */

/* Begin PBXShellScriptBuildPhase section */
		3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
			isa = PBXShellScriptBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			inputPaths = (
			);
			name = "Thin Binary";
			outputPaths = (
			);
			runOnlyForDeploymentPostprocessing = 0;
			shellPath = /bin/sh;
			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
		};
		79D9EC2F681B8FDF039DE67A /* [CP] Check Pods Manifest.lock */ = {
			isa = PBXShellScriptBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			inputFileListPaths = (
			);
			inputPaths = (
				"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
				"${PODS_ROOT}/Manifest.lock",
			);
			name = "[CP] Check Pods Manifest.lock";
			outputFileListPaths = (
			);
			outputPaths = (
				"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
			);
			runOnlyForDeploymentPostprocessing = 0;
			shellPath = /bin/sh;
			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
			showEnvVarsInLog = 0;
		};
		9740EEB61CF901F6004384FC /* Run Script */ = {
			isa = PBXShellScriptBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			inputPaths = (
			);
			name = "Run Script";
			outputPaths = (
			);
			runOnlyForDeploymentPostprocessing = 0;
			shellPath = /bin/sh;
			shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
		};
		D1539A2B591CC9A875AC7664 /* [CP] Embed Pods Frameworks */ = {
			isa = PBXShellScriptBuildPhase;
			buildActionMask = 2147483647;
			files = (
			);
			inputFileListPaths = (
				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
			);
			name = "[CP] Embed Pods Frameworks";
			outputFileListPaths = (
				"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
			);
			runOnlyForDeploymentPostprocessing = 0;
			shellPath = /bin/sh;
			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
			showEnvVarsInLog = 0;
		};
/* End PBXShellScriptBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
		97C146EA1CF9000F007C117D /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
				1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXSourcesBuildPhase section */

/* Begin PBXVariantGroup section */
		97C146FA1CF9000F007C117D /* Main.storyboard */ = {
			isa = PBXVariantGroup;
			children = (
				97C146FB1CF9000F007C117D /* Base */,
			);
			name = Main.storyboard;
			sourceTree = "<group>";
		};
		97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
			isa = PBXVariantGroup;
			children = (
				97C147001CF9000F007C117D /* Base */,
			);
			name = LaunchScreen.storyboard;
			sourceTree = "<group>";
		};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
		249021D3217E4FDB00AE95B9 /* Profile */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
				MTL_ENABLE_DEBUG_INFO = NO;
				SDKROOT = iphoneos;
				SUPPORTED_PLATFORMS = iphoneos;
				TARGETED_DEVICE_FAMILY = "1,2";
				VALIDATE_PRODUCT = YES;
			};
			name = Profile;
		};
		249021D4217E4FDB00AE95B9 /* Profile */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				CLANG_ENABLE_MODULES = YES;
				CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
				DEVELOPMENT_TEAM = 2U5AVM796N;
				ENABLE_BITCODE = NO;
				INFOPLIST_FILE = Runner/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = com.example.moneyAssistant2608;
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = 1;
				VERSIONING_SYSTEM = "apple-generic";
			};
			name = Profile;
		};
		97C147031CF9000F007C117D /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = dwarf;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				ENABLE_TESTABILITY = YES;
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
				MTL_ENABLE_DEBUG_INFO = YES;
				ONLY_ACTIVE_ARCH = YES;
				SDKROOT = iphoneos;
				TARGETED_DEVICE_FAMILY = "1,2";
			};
			name = Debug;
		};
		97C147041CF9000F007C117D /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
				MTL_ENABLE_DEBUG_INFO = NO;
				SDKROOT = iphoneos;
				SUPPORTED_PLATFORMS = iphoneos;
				SWIFT_COMPILATION_MODE = wholemodule;
				SWIFT_OPTIMIZATION_LEVEL = "-O";
				TARGETED_DEVICE_FAMILY = "1,2";
				VALIDATE_PRODUCT = YES;
			};
			name = Release;
		};
		97C147061CF9000F007C117D /* Debug */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				CLANG_ENABLE_MODULES = YES;
				CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
				DEVELOPMENT_TEAM = 2U5AVM796N;
				ENABLE_BITCODE = NO;
				INFOPLIST_FILE = Runner/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = com.example.moneyAssistant2608;
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = 1;
				VERSIONING_SYSTEM = "apple-generic";
			};
			name = Debug;
		};
		97C147071CF9000F007C117D /* Release */ = {
			isa = XCBuildConfiguration;
			baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				CLANG_ENABLE_MODULES = YES;
				CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
				CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
				DEVELOPMENT_TEAM = 2U5AVM796N;
				ENABLE_BITCODE = NO;
				INFOPLIST_FILE = Runner/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = com.example.moneyAssistant2608;
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = 1;
				VERSIONING_SYSTEM = "apple-generic";
			};
			name = Release;
		};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
		97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				97C147031CF9000F007C117D /* Debug */,
				97C147041CF9000F007C117D /* Release */,
				249021D3217E4FDB00AE95B9 /* Profile */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				97C147061CF9000F007C117D /* Debug */,
				97C147071CF9000F007C117D /* Release */,
				249021D4217E4FDB00AE95B9 /* Profile */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
/* End XCConfigurationList section */
	};
	rootObject = 97C146E61CF9000F007C117D /* Project object */;
}


================================================
FILE: ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "self:">
   </FileRef>
</Workspace>


================================================
FILE: ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>IDEDidComputeMac32BitWarning</key>
	<true/>
</dict>
</plist>


================================================
FILE: ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>PreviewsEnabled</key>
	<false/>
</dict>
</plist>


================================================
FILE: ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
   LastUpgradeVersion = "1020"
   version = "1.3">
   <BuildAction
      parallelizeBuildables = "YES"
      buildImplicitDependencies = "YES">
      <BuildActionEntries>
         <BuildActionEntry
            buildForTesting = "YES"
            buildForRunning = "YES"
            buildForProfiling = "YES"
            buildForArchiving = "YES"
            buildForAnalyzing = "YES">
            <BuildableReference
               BuildableIdentifier = "primary"
               BlueprintIdentifier = "97C146ED1CF9000F007C117D"
               BuildableName = "Runner.app"
               BlueprintName = "Runner"
               ReferencedContainer = "container:Runner.xcodeproj">
            </BuildableReference>
         </BuildActionEntry>
      </BuildActionEntries>
   </BuildAction>
   <TestAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      shouldUseLaunchSchemeArgsEnv = "YES">
      <Testables>
      </Testables>
      <MacroExpansion>
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "97C146ED1CF9000F007C117D"
            BuildableName = "Runner.app"
            BlueprintName = "Runner"
            ReferencedContainer = "container:Runner.xcodeproj">
         </BuildableReference>
      </MacroExpansion>
      <AdditionalOptions>
      </AdditionalOptions>
   </TestAction>
   <LaunchAction
      buildConfiguration = "Debug"
      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
      launchStyle = "0"
      useCustomWorkingDirectory = "NO"
      ignoresPersistentStateOnLaunch = "NO"
      debugDocumentVersioning = "YES"
      debugServiceExtension = "internal"
      allowLocationSimulation = "YES">
      <BuildableProductRunnable
         runnableDebuggingMode = "0">
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "97C146ED1CF9000F007C117D"
            BuildableName = "Runner.app"
            BlueprintName = "Runner"
            ReferencedContainer = "container:Runner.xcodeproj">
         </BuildableReference>
      </BuildableProductRunnable>
      <AdditionalOptions>
      </AdditionalOptions>
   </LaunchAction>
   <ProfileAction
      buildConfiguration = "Profile"
      shouldUseLaunchSchemeArgsEnv = "YES"
      savedToolIdentifier = ""
      useCustomWorkingDirectory = "NO"
      debugDocumentVersioning = "YES">
      <BuildableProductRunnable
         runnableDebuggingMode = "0">
         <BuildableReference
            BuildableIdentifier = "primary"
            BlueprintIdentifier = "97C146ED1CF9000F007C117D"
            BuildableName = "Runner.app"
            BlueprintName = "Runner"
            ReferencedContainer = "container:Runner.xcodeproj">
         </BuildableReference>
      </BuildableProductRunnable>
   </ProfileAction>
   <AnalyzeAction
      buildConfiguration = "Debug">
   </AnalyzeAction>
   <ArchiveAction
      buildConfiguration = "Release"
      revealArchiveInOrganizer = "YES">
   </ArchiveAction>
</Scheme>


================================================
FILE: ios/Runner.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "group:Runner.xcodeproj">
   </FileRef>
   <FileRef
      location = "group:Pods/Pods.xcodeproj">
   </FileRef>
</Workspace>


================================================
FILE: ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>IDEDidComputeMac32BitWarning</key>
	<true/>
</dict>
</plist>


================================================
FILE: ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>PreviewsEnabled</key>
	<false/>
</dict>
</plist>


================================================
FILE: lib/main.dart
================================================
// @dart=2.9


import 'package:money_assistant_2608/project/real_main.dart';

void main() async {
  realMain();
}


================================================
FILE: lib/project/app_pages/add_category.dart
================================================
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:money_assistant_2608/project/app_pages/parent_category.dart';
import 'package:money_assistant_2608/project/classes/app_bar.dart';
import 'package:money_assistant_2608/project/classes/category_item.dart';
import 'package:money_assistant_2608/project/classes/constants.dart';
import 'package:money_assistant_2608/project/classes/saveOrSaveAndDeleteButtons.dart';
import 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';
import 'package:money_assistant_2608/project/localization/methods.dart';
import 'package:money_assistant_2608/project/provider.dart';
import 'package:provider/provider.dart';

import 'select_icon.dart';

class AddCategory extends StatelessWidget {
  final BuildContext? contextEx, contextExEdit, contextInEdit, contextIn;
  final String type, appBarTitle;
  final String? categoryName, description;
  final IconData? categoryIcon;
  final CategoryItem? parentItem;
  static final _formKey4 = GlobalKey<FormState>(debugLabel: '_formKey4'),
      _formKey5 = GlobalKey<FormState>(debugLabel: '_formKey5');
  AddCategory(
      {this.contextExEdit,
      this.contextEx,
      this.contextInEdit,
      this.contextIn,
      required this.type,
      required this.appBarTitle,
      this.categoryName,
      this.categoryIcon,
      this.parentItem,
      this.description});

  void unFocusNode(BuildContext context) {
    FocusScopeNode currentFocus = FocusScope.of(context);
    if (!currentFocus.hasPrimaryFocus) {
      currentFocus.unfocus();
    }
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
        onTap: () {
          unFocusNode(context);
        },
        child: Scaffold(
          backgroundColor: blue1,
          appBar: BasicAppBar(this.appBarTitle),
          body: Form(
            key: this.type == 'Income' ? _formKey4 : _formKey5,
            child: ChangeNotifierProvider<ChangeCategory>(
              create: (context) => ChangeCategory(),
              child: ListView(
                children: [
                  CategoryName(
                      this.type,
                      this.categoryName == null
                          ? null
                          : getTranslated(context, this.categoryName!) ??
                              this.categoryName,
                      this.categoryIcon),
                  // Hide ParentCategoryCard when either type is Income or users press on parent category
                  // Fix this? why not (this.categoryName == null && this.parentCategory != null)
                  this.type == 'Income' ||
                          (this.categoryName != null && this.parentItem == null)
                      ? SizedBox()
                      : ParentCategoryCard(this.parentItem),
                  SizedBox(
                    height: 20.h,
                  ),
                  Description(this.description),
                  Padding(
                      padding: EdgeInsets.symmetric(vertical: 90.h),
                      child: Save(
                          formKey:
                              this.type == 'Income' ? _formKey4 : _formKey5,
                          contextEx: this.contextEx,
                          contextExEdit: this.contextExEdit,
                          contextIn: this.contextIn,
                          contextInEdit: this.contextInEdit,
                          categoryName: this.categoryName,
                          categoryIcon: this.categoryIcon,
                          parentItem: this.parentItem,
                          description: this.description))
                ],
              ),
            ),
          ),
        ));
  }
}

class CategoryName extends StatefulWidget {
  final String type;
  final String? categoryName;
  final IconData? categoryIcon;
  CategoryName(this.type, this.categoryName, this.categoryIcon);
  @override
  _CategoryNameState createState() => _CategoryNameState();
}

class _CategoryNameState extends State<CategoryName> {
  // late final FocusNode categoryNameFocusNode;
  static late TextEditingController categoryNameController;
  final FocusNode categoryNameFocusNode = FocusNode();

  @override
  void initState() {
    super.initState();
    // categoryNameFocusNode = FocusNode();
    categoryNameController =
        TextEditingController(text: widget.categoryName ?? '');
  }

  // @override
  // void dispose() {
  //   categoryNameFocusNode.dispose();
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    return Card(
      elevation: 7,
      child: Padding(
        padding: EdgeInsets.only(left: 10.w, top: 8.h, bottom: 8.h),
        child: TextFormField(
          controller: categoryNameController,
          focusNode: categoryNameFocusNode,
          onChanged: (value) => {},
          maxLines: null,
          cursorColor: blue1,
          textCapitalization: TextCapitalization.sentences,
          style: TextStyle(fontSize: 22.sp, fontWeight: FontWeight.bold),
          validator: (categoryNameInput) {
            categoryNameInput = categoryNameInput!.trim();
            if (categoryNameInput.isEmpty) {
              return getTranslated(context, 'Please fill a category name');
            } else {
              bool isIdenticalCategory() {
                if (widget.type == 'Income') {
                  for (CategoryItem incomeItem in incomeItems) {
                    if (categoryNameInput == incomeItem.text) {
                      return true;
                    }
                  }
                } else {
                  List<CategoryItem> expenseItems = [];
                  sharedPrefs.getAllExpenseItemsLists().forEach(
                      (parentExpenseItem) => parentExpenseItem.forEach(
                          (expenseItem) => expenseItems.add(expenseItem)));
                  for (CategoryItem expenseItem in expenseItems) {
                    if (categoryNameInput == expenseItem.text) {
                      return true;
                    }
                  }
                }
                return false;
              }

              // Show an error if users want to edit to or add an existing category
              if ((categoryNameInput != widget.categoryName) &&
                  (isIdenticalCategory())) {
                return getTranslated(context, 'Category already exists');
              }
            }
          },
          decoration: InputDecoration(
              border: InputBorder.none,
              hintText: getTranslated(context, 'Category name'),
              hintStyle: TextStyle(
                  fontSize: 22.sp,
                  color: grey,
                  fontStyle: FontStyle.italic,
                  fontWeight: FontWeight.normal),
              suffixIcon: categoryNameController.text.length > 0
                  ? IconButton(
                      icon: Icon(Icons.clear),
                      onPressed: () {
                        categoryNameController.clear();
                      })
                  : SizedBox(),
              icon: Selector<ChangeCategory, IconData?>(
                  selector: (_, provider) => provider.selectedCategoryIcon,
                  builder: (context, selectedCategoryIcon, child) {
                    return GestureDetector(
                      onTap: () async {
                        IconData? selectedIcon = await Navigator.push(
                                context,
                                MaterialPageRoute(
                                    builder: (context) =>
                                        SelectIcon(widget.type))) ??
                            selectedCategoryIcon;

                        context
                            .read<ChangeCategory>()
                            .changeCategoryIcon(selectedIcon);
                      },
                      child: Column(
                        children: [
                          CircleAvatar(
                              radius: 20.r,
                              backgroundColor: Color.fromRGBO(215, 223, 231, 1),
                              child: Icon(
                                selectedCategoryIcon ??
                                    widget.categoryIcon ??
                                    Icons.category_outlined,
                                size: 25.sp,
                                color: widget.type == 'Income' ? green : red,
                              )),
                          SizedBox(
                            height: 2,
                          ),
                          Text(
                            'select icon',
                            style:
                                TextStyle(fontSize: 11, color: Colors.blueGrey),
                          )
                        ],
                      ),
                    );
                  })),
        ),
      ),
    );
  }
}

class ParentCategoryCard extends StatefulWidget {
  final CategoryItem? parentItem;
  const ParentCategoryCard(this.parentItem);
  @override
  _ParentCategoryCardState createState() => _ParentCategoryCardState();
}

class _ParentCategoryCardState extends State<ParentCategoryCard> {
  @override
  Widget build(BuildContext context) {
    return Selector<ChangeCategory, CategoryItem?>(
        selector: (_, provider) => provider.parentItem,
        builder: (context, selectedParentItem, child) {
          selectedParentItem ??= widget.parentItem ??
              categoryItem(Icons.category_outlined,
                  getTranslated(context, 'Parent category')!);
          context.read<ChangeCategory>().parentItem = selectedParentItem;
          return GestureDetector(
              onTap: () async {
                CategoryItem newParentItem = await Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (context) => ParentCategoryList()));
                context.read<ChangeCategory>().changeParentItem(newParentItem);
              },
              child: Card(
                elevation: 7,
                child: Padding(
                  padding: EdgeInsets.only(left: 18.w, top: 6.h, bottom: 6.h),
                  child: Row(
                    children: [
                      CircleAvatar(
                          radius: 20.r,
                          backgroundColor: Color.fromRGBO(215, 223, 231, 1),
                          child: Icon(
                            iconData(selectedParentItem),
                            size: 25.sp,
                            color: red,
                          )),
                      SizedBox(
                        width: 28.w,
                      ),
                      Text(
                        getTranslated(context, selectedParentItem.text) ??
                            selectedParentItem.text,
                        style: selectedParentItem.text ==
                                getTranslated(context, 'Parent category')!
                            ? TextStyle(
                                fontSize: 22.sp,
                                color: grey,
                                fontStyle: FontStyle.italic,
                              )
                            : TextStyle(
                                fontSize: 22.sp,
                                color: red,
                                fontWeight: FontWeight.bold),
                      ),
                      Spacer(),
                      Icon(
                        Icons.arrow_forward_ios,
                        size: 22.sp,
                      ),
                      SizedBox(
                        width: 10.h,
                      )
                    ],
                  ),
                ),
              ));
        });
  }
}

class Description extends StatefulWidget {
  final String? description;
  Description(this.description);
  @override
  _DescriptionState createState() => _DescriptionState();
}

class _DescriptionState extends State<Description> {
  final FocusNode descriptionFocusNode = FocusNode();
  static late TextEditingController descriptionController;

  @override
  void initState() {
    super.initState();
    descriptionController =
        TextEditingController(text: widget.description ?? '');
  }

  @override
  Widget build(BuildContext context) {
    return Card(
      elevation: 7,
      child: SizedBox(
        child: Padding(
          padding: EdgeInsets.symmetric(horizontal: 15.w, vertical: 6.h),
          child: TextFormField(
              controller: descriptionController,
              focusNode: descriptionFocusNode,
              maxLines: null,
              minLines: 1,
              cursorColor: blue1,
              textCapitalization: TextCapitalization.sentences,
              style: TextStyle(fontSize: 22.sp),
              decoration: InputDecoration(
                  border: InputBorder.none,
                  hintText:
                      getTranslated(context, 'Description') ?? 'Description',
                  hintStyle: GoogleFonts.cousine(
                    fontSize: 21.5.sp,
                    fontStyle: FontStyle.italic,
                  ),
                  suffixIcon: descriptionController.text.length > 0
                      ? IconButton(
                          icon: Icon(Icons.clear),
                          onPressed: () {
                            descriptionController.clear();
                          })
                      : SizedBox(),
                  icon: Padding(
                    padding: EdgeInsets.only(right: 10.w),
                    child: Icon(
                      Icons.description_outlined,
                      size: 35.sp,
                      color: Colors.blueGrey,
                    ),
                  ))),
        ),
      ),
    );
  }
}

class Save extends StatefulWidget {
  final GlobalKey<FormState> formKey;
  final BuildContext? contextEx, contextExEdit, contextIn, contextInEdit;
  final String? categoryName, description;
  final IconData? categoryIcon;
  final CategoryItem? parentItem;
  const Save(
      {required this.formKey,
      this.contextEx,
      this.contextExEdit,
      this.contextIn,
      this.contextInEdit,
      this.categoryName,
      this.categoryIcon,
      this.parentItem,
      this.description});

  @override
  _SaveState createState() => _SaveState();
}

class _SaveState extends State<Save> {
  @override
  Widget build(BuildContext context) {
    void saveCategoryFunction() {
      if (widget.formKey.currentState!.validate()) {
        String? finalDescription = _DescriptionState.descriptionController.text;
        String finalCategoryName =
            _CategoryNameState.categoryNameController.text;
        IconData? finalCategoryIcon =
            Provider.of<ChangeCategory>(context, listen: false)
                .selectedCategoryIcon;
        // trim to get a real input
        finalCategoryName = finalCategoryName.trim();
        finalDescription = finalDescription.trim();

        CategoryItem categoryItem(IconData iconData) => CategoryItem(
            iconData.codePoint,
            iconData.fontPackage,
            iconData.fontFamily,
            finalCategoryName,
            finalDescription);

        void updateCategory() {
          Provider.of<ChangeExpenseItemEdit>(widget.contextExEdit!,
                  listen: false)
              .getAllExpenseItems();
          Provider.of<ChangeExpenseItem>(widget.contextEx!, listen: false)
              .getAllExpenseItems();
        }

        if (widget.contextInEdit != null) {
          print('income');
          if (widget.categoryName != null) {
            print('edit');
            if (finalCategoryName != widget.categoryName ||
                widget.categoryIcon != finalCategoryIcon ||
                widget.description != finalDescription) {
              print('something changed');
              incomeItems
                  .removeWhere((item) => item.text == widget.categoryName);
            }
          }
          incomeItems.add(categoryItem(finalCategoryIcon ??
              widget.categoryIcon ??
              Icons.category_outlined));
          sharedPrefs.saveItems('income items', incomeItems);
          Provider.of<ChangeIncomeItemEdit>(widget.contextInEdit!,
                  listen: false)
              .getIncomeItems();
          if (widget.contextIn != null) {
            Provider.of<ChangeIncomeItem>(widget.contextIn!, listen: false)
                .getIncomeItems();
          }
        } else {
          print('expense');
          CategoryItem? finalParent = context.read<ChangeCategory>().parentItem;

          if ((widget.categoryName == null) && (widget.parentItem == null)) {
            CategoryItem item =
                categoryItem(finalCategoryIcon ?? Icons.category_outlined);
            print('add expense');
            if (finalParent!.text ==
                getTranslated(context, 'Parent category')!) {
              print('add parent');
              sharedPrefs.saveItems(finalCategoryName, [item]);

              var parentExpenseItemNames = sharedPrefs.parentExpenseItemNames;
              parentExpenseItemNames.add(finalCategoryName);
              sharedPrefs.parentExpenseItemNames = parentExpenseItemNames;
            } else {
              print('add new expense category to an existing parent');
              List<CategoryItem> items = sharedPrefs.getItems(finalParent.text);
              items.add(item);
              sharedPrefs.saveItems(finalParent.text, items);
            }
            updateCategory();
          } else {
            print('edit');
            if (widget.parentItem == null) {
              print('edit parent only');
              if (finalCategoryName != widget.categoryName ||
                  widget.categoryIcon != finalCategoryIcon ||
                  widget.description != finalDescription) {
                print('something changed');
                List<CategoryItem> items =
                    sharedPrefs.getItems(widget.categoryName!);
                items.removeAt(0);
                items.insert(
                    0, categoryItem(finalCategoryIcon ?? widget.categoryIcon!));

                sharedPrefs.saveItems(finalCategoryName, items);
                if (finalCategoryName != widget.categoryName) {
                  print('parent name changed');
                  var parentExpenseItemNames =
                      sharedPrefs.parentExpenseItemNames;

                  parentExpenseItemNames.removeWhere((parentExpenseItemName) =>
                      widget.categoryName == parentExpenseItemName);
                  parentExpenseItemNames.insert(0, finalCategoryName);
                  sharedPrefs.parentExpenseItemNames = parentExpenseItemNames;
                }
                updateCategory();
              }
            } else {
              print('edit category');
              if (finalParent!.text != widget.parentItem!.text ||
                  widget.categoryIcon != finalCategoryIcon ||
                  finalCategoryName != widget.categoryName ||
                  widget.description != finalDescription) {
                print('something changed');
                void itemsAdd(List<CategoryItem> items) {
                  items.add(
                      categoryItem(finalCategoryIcon ?? widget.categoryIcon!));
                }

                List<CategoryItem> items =
                    sharedPrefs.getItems(widget.parentItem!.text);
                items.removeWhere((item) => item.text == widget.categoryName);

                if (finalParent.text != widget.parentItem!.text) {
                  print('edit parent of expense category');
                  List<CategoryItem> itemsMovedTo =
                      sharedPrefs.getItems(finalParent.text);
                  itemsAdd(itemsMovedTo);
                  sharedPrefs.saveItems(finalParent.text, itemsMovedTo);
                } else {
                  print('edit other things');
                  itemsAdd(items);
                }
                sharedPrefs.saveItems(widget.parentItem!.text, items);
                updateCategory();
              }
            }
          }
        }
        Navigator.pop(context);
      }
    }

    if (widget.categoryName == null && widget.parentItem == null) {
      return SaveButton(false, saveCategoryFunction, null);
    } else {
      return SaveAndDeleteButton(
          saveAndDeleteInput: false,
          saveCategory: saveCategoryFunction,
          categoryName: widget.categoryName,
          parentExpenseItem:
              widget.parentItem == null ? null : widget.parentItem!.text,
          contextEx: widget.contextEx,
          contextExEdit: widget.contextExEdit,
          contextIn: widget.contextIn,
          contextInEdit: widget.contextInEdit);
    }
  }
}


================================================
FILE: lib/project/app_pages/analysis.dart
================================================
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:intl/intl.dart';
import 'package:money_assistant_2608/project/classes/app_bar.dart';
import 'package:money_assistant_2608/project/classes/category_item.dart';
import 'package:money_assistant_2608/project/classes/chart_pie.dart';
import 'package:money_assistant_2608/project/classes/constants.dart';
import 'package:money_assistant_2608/project/classes/dropdown_box.dart';
import 'package:money_assistant_2608/project/classes/input_model.dart';
import 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';
import 'package:money_assistant_2608/project/database_management/sqflite_services.dart';
import 'package:money_assistant_2608/project/localization/methods.dart';
import 'package:provider/provider.dart';
import '../provider.dart';
import 'report.dart';

final List<InputModel> chartDataNull = [
  InputModel(
      id: null,
      type: null,
      amount: 1,
      category: '',
      description: null,
      date: null,
      time: null,
      color: const Color.fromRGBO(0, 220, 252, 1))
];

class Analysis extends StatefulWidget {
  @override
  _AnalysisState createState() => _AnalysisState();
}

class _AnalysisState extends State<Analysis> {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<ChangeSelectedDate>(
      create: (context) => ChangeSelectedDate(),
      child: DefaultTabController(
        initialIndex: 0,
        length: 2,
        child: Scaffold(
            backgroundColor: blue1,
            appBar: InExAppBar(false),
            body: Selector<ChangeSelectedDate, String?>(
                selector: (_, changeSelectedDate) =>
                    changeSelectedDate.selectedAnalysisDate,
                builder: (context, selectedAnalysisDate, child) {
                  selectedAnalysisDate ??= sharedPrefs.selectedDate;
                  ListView listViewChild(String type) => ListView(
                        children: [
                          ShowDate(true, selectedAnalysisDate!),
                          ShowDetails(type, selectedAnalysisDate),
                        ],
                      );
                  return TabBarView(
                    children: [
                      listViewChild('Expense'),
                      listViewChild('Income')
                    ],
                  );
                })),
      ),
    );
  }
}

class ShowDate extends StatelessWidget {
  final bool forAnalysis;
  final String selectedDate;
  const ShowDate(this.forAnalysis, this.selectedDate);
  @override
  Widget build(BuildContext context) {
    return Padding(
        padding: EdgeInsets.symmetric(
          horizontal: 10.w,
          vertical: 25.h,
        ),
        child: Row(
          children: [
            Icon(
              Icons.calendar_today,
              size: 27.sp,
              color: Color.fromRGBO(82, 179, 252, 1),
            ),
            SizedBox(
              width: 10.w,
            ),
            DateDisplay(this.selectedDate),
            Spacer(),
            DropDownBox(this.forAnalysis, this.selectedDate)
          ],
        ));
  }
}

class DateDisplay extends StatelessWidget {
  final String selectedDate;
  DateDisplay(this.selectedDate);

  @override
  Widget build(BuildContext context) {
    final String today = DateFormat(sharedPrefs.dateFormat).format(todayDT);
    String since = getTranslated(context, 'Since')!;
    TextStyle style =
        GoogleFonts.aBeeZee(fontSize: 20.sp, fontWeight: FontWeight.bold);

    Map<String, Widget> dateMap = {
      'Today': Text('$today', style: style),
      'This week': Text(
        '$since ${DateFormat(sharedPrefs.dateFormat).format(startOfThisWeek)}',
        style: style,
      ),
      'This month': Text(
          '$since ${DateFormat(sharedPrefs.dateFormat).format(startOfThisMonth)}',
          style: style),
      'This quarter': Text(
        '$since ${DateFormat(sharedPrefs.dateFormat).format(startOfThisQuarter)}',
        style: style,
      ),
      'This year': Text(
        '$since ${DateFormat(sharedPrefs.dateFormat).format(startOfThisYear)}',
        style: style,
      ),
      'All': Text('${getTranslated(context, 'All')!}', style: style)
    };
    var dateListKey = dateMap.keys.toList();
    var dateListValue = dateMap.values.toList();

    for (int i = 0; i < dateListKey.length; i++) {
      if (selectedDate == dateListKey[i]) {
        return dateListValue[i];
      }
    }
    return Container();
  }
}

class ShowMoneyFrame extends StatelessWidget {
  final String type;
  final double typeValue, balance;
  const ShowMoneyFrame(this.type, this.typeValue, this.balance);

  @override
  Widget build(BuildContext context) {
    Widget rowFrame(String typeName, double value) {
      return Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
          Text(
            getTranslated(context, typeName)!,
            style: TextStyle(fontSize: 22.sp),
          ),
          Expanded(
            child: Text(
              format(value) + ' ' + currency,
              style: GoogleFonts.aBeeZee(
                  fontSize: format(value.toDouble()).length > 22
                      ? 16.5.sp
                      : format(value.toDouble()).length > 17
                          ? 19.5.sp
                          : 22.sp),
              // fix here: Overflow is a temporary parameter, fix whatever it is so that the money value will never overflow
              overflow: TextOverflow.ellipsis,
              textAlign: TextAlign.end,
            ),
          ),
        ],
      );
    }

    return Container(
      decoration: BoxDecoration(
          color: Color.fromRGBO(239, 247, 253, 1),
          borderRadius: BorderRadius.circular(40.r),
          border: Border.all(
            color: grey,
            width: 0.4.w,
          )),
      child: Padding(
        padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 18.5.h),
        child: Column(
          children: [
            rowFrame(this.type, typeValue),
            SizedBox(
              height: 12.5.h,
            ),
            rowFrame('Balance', this.balance)
          ],
        ),
      ),
    );
  }
}

class ShowDetails extends StatefulWidget {
  final String type, selectedDate;
  ShowDetails(this.type, this.selectedDate);

  @override
  _ShowDetailsState createState() => _ShowDetailsState();
}

class _ShowDetailsState extends State<ShowDetails> {
  Widget showInExDetails(
    BuildContext context,
    List<InputModel> transactionsSorted,
  ) {
    List<CategoryItem> itemList = widget.type == 'Income'
        ? createItemList(
            transactions: transactionsSorted,
            forAnalysisPage: true,
            isIncomeType: true,
            forSelectIconPage: false)
        : createItemList(
            transactions: transactionsSorted,
            forAnalysisPage: true,
            isIncomeType: false,
            forSelectIconPage: false);

    return Column(
        children: List.generate(itemList.length, (int) {
      return
          // SwipeActionCell(
          // backgroundColor: Colors.transparent,
          //   key: ObjectKey(transactionsSorted[int]),
          //   performsFirstActionWithFullSwipe: true,
          //   trailingActions: <SwipeAction>[
          //     SwipeAction(
          //         title: "Delete",
          //         onTap: (CompletionHandler handler) async {
          //           Future<void> onDeletion() async {
          //             await handler(true);
          //             transactionsSorted.removeAt(int);
          //             customToast(context, 'Transactions has been deleted');
          //             setState(() {});
          //           }
          //
          //           Platform.isIOS
          //               ? await iosDialog(
          //                   context,
          //                   'Deleted data can not be recovered. Are you sure you want to Delete All Transactions In This Category?',
          //                   'Delete',
          //                   onDeletion)
          //               : await androidDialog(
          //                   context,
          //                   'Deleted data can not be recovered. Are you sure you want to Delete All Transactions In This Category?',
          //                   'Delete',
          //                   onDeletion);
          //         },
          //         color: red),
          //   ], child:
          GestureDetector(
              onTap: () {
                Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (context) => Report(
                              type: widget.type,
                              category: itemList[int].text,
                              selectedDate: widget.selectedDate,
                              icon: iconData(itemList[int]),
                            ))).then((value) => setState(() {}));
              },
              child: CategoryDetails(
                  widget.type,
                  getTranslated(context, itemList[int].text) ??
                      itemList[int].text,
                  transactionsSorted[int].amount!,
                  transactionsSorted[int].color,
                  iconData(itemList[int]),
                  false));
    }));
  }

  @override
  Widget build(BuildContext context) {
    late Map<String, double> chartDataMap;
    return FutureBuilder<List<InputModel>>(
        initialData: [],
        future: DB.inputModelList(),
        builder:
            (BuildContext context, AsyncSnapshot<List<InputModel>> snapshot) {
          connectionUI(snapshot);
          if (snapshot.connectionState == ConnectionState.waiting) {
            return ShowNullDetail(0, null, this.widget.type, false);
          }
          if (snapshot.data == null) {
            return ShowNullDetail(0, chartDataNull, this.widget.type, true);
          } else {
            double income = 0, expense = 0, balance = 0;

            List<InputModel> allTransactions =
                filterData(context, snapshot.data!, widget.selectedDate);

            if (allTransactions.length > 0) {
              //prepare for MoneyFrame

              List<double?> incomeList = [], expenseList = [];
              incomeList = allTransactions
                  .map((data) {
                    if (data.type == 'Income') {
                      return data.amount;
                    }
                  })
                  .where((element) => element != null)
                  .toList();

              expenseList = allTransactions
                  .map((data) {
                    if (data.type == 'Expense') {
                      return data.amount;
                    }
                  })
                  .where((element) => element != null)
                  .toList();

              if (incomeList.length > 0) {
                for (int i = 0; i < incomeList.length; i++) {
                  income = income + incomeList[i]!;
                }
              }
              if (expenseList.length > 0) {
                for (int i = 0; i < expenseList.length; i++) {
                  expense = expense + expenseList[i]!;
                }
              }
              balance = income - expense;

              // prepare for InExDetails
              if (this.widget.type == 'Income') {
                allTransactions = allTransactions
                    .map((data) {
                      if (data.type == 'Income') {
                        return inputModel(data);
                      }
                    })
                    .where((element) => element != null)
                    .cast<InputModel>()
                    .toList();
              } else {
                allTransactions = allTransactions
                    .map((data) {
                      if (data.type == 'Expense') {
                        return inputModel(data);
                      }
                    })
                    .where((element) => element != null)
                    .cast<InputModel>()
                    .toList();
              }
            }

            if (allTransactions.length == 0) {
              return ShowNullDetail(
                  balance, chartDataNull, this.widget.type, true);
            } else {
              List<InputModel> transactionsSorted = [
                InputModel(
                  type: this.widget.type,
                  amount: allTransactions[0].amount,
                  category: allTransactions[0].category,
                )
              ];

              int i = 1;
              //cmt: chartDataListDetailed.length must be greater than 2 to execute
              while (i < allTransactions.length) {
                allTransactions
                    .sort((a, b) => a.category!.compareTo(b.category!));

                if (i == 1) {
                  chartDataMap = {
                    allTransactions[0].category!: allTransactions[0].amount!
                  };
                }

                if (allTransactions[i].category ==
                    allTransactions[i - 1].category) {
                  chartDataMap.update(allTransactions[i].category!,
                      (value) => (value + allTransactions[i].amount!),
                      ifAbsent: () => (allTransactions[i - 1].amount! +
                          allTransactions[i].amount!));
                  i++;
                } else {
                  chartDataMap.addAll({
                    allTransactions[i].category!: allTransactions[i].amount!
                  });

                  i++;
                }
                transactionsSorted = chartDataMap.entries
                    .map((entry) => InputModel(
                          type: this.widget.type,
                          category: entry.key,
                          amount: entry.value,
                        ))
                    .toList();
              }

              void recurringFunc({required int i, n}) {
                if (n > i) {
                  for (int c = 1; c <= n - i; c++) {
                    transactionsSorted[i + c - 1].color = chartPieColors[c - 1];
                    recurringFunc(i: i, n: c);
                  }
                }
              }

              for (int n = 1; n <= transactionsSorted.length; n++) {
                transactionsSorted[n - 1].color = chartPieColors[n - 1];
                recurringFunc(i: chartPieColors.length, n: n);
              }
              return Column(
                children: [
                  ShowMoneyFrame(this.widget.type,
                      this.widget.type == 'Income' ? income : expense, balance),
                  SizedBox(height: 360.h, child: ChartPie(transactionsSorted)),
                  showInExDetails(
                    context,
                    // sum value of transactions having a same category to one
                    transactionsSorted,
                  )
                ],
              );
            }
          }
        });
  }
}

class ShowNullDetail extends StatelessWidget {
  final double balanceValue;
  final List<InputModel>? chartData;
  final String type;
  final bool connection;
  ShowNullDetail(this.balanceValue, this.chartData, this.type, this.connection);
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        ShowMoneyFrame(this.type, 0, this.balanceValue),
        SizedBox(
            height: 360.h,
            child: connection == false ? null : ChartPie(this.chartData!)),
        CategoryDetails(
            this.type,
            getTranslated(context, 'Category') ?? 'Category',
            0,
            this.type == 'Income' ? green : red,
            Icons.category_outlined,
            true)
      ],
    );
  }
}

class CategoryDetails extends StatelessWidget {
  final String type, category;
  final double amount;
  final Color? color;
  final IconData icon;
  final bool forNullDetail;
  CategoryDetails(this.type, this.category, this.amount, this.color, this.icon,
      this.forNullDetail);
  @override
  Widget build(BuildContext context) {
    return Card(
        color: white,
        elevation: 3,
        shape:
            RoundedRectangleBorder(borderRadius: BorderRadius.circular(15.r)),
        child: Padding(
          padding: EdgeInsets.symmetric(horizontal: 15.w, vertical: 15.h),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              Icon(
                this.icon,
                color: forNullDetail
                    ? this.type == 'Income'
                        ? green
                        : red
                    : this.color,
                size: 23.sp,
              ),
              Expanded(
                child: Padding(
                  padding: EdgeInsets.only(left: 15.w, right: 10.w),
                  child: Text(
                    this.category,
                    style: TextStyle(fontSize: 20.sp),
                    overflow: TextOverflow.ellipsis,
                    textAlign: TextAlign.start,
                  ),
                ),
              ),
              // attention: This widget will never overflow
              Flexible(
                flex: 0,
                child: Text(
                  // '${this.color!.red},' + '${this.color!.green},' + '${this.color!.blue},',
                  format(amount) + ' ' + currency,
                  style: GoogleFonts.aBeeZee(fontSize: 20.sp),
                  overflow: TextOverflow.ellipsis,
                  textAlign: TextAlign.end,
                ),
              ),
              SizedBox(
                width: 10.w,
              ),
              forNullDetail
                  ? SizedBox()
                  : Icon(
                      Icons.arrow_forward_ios,
                      size: 18.sp,
                    ),
            ],
          ),
        ));
  }
}


================================================
FILE: lib/project/app_pages/calendar.dart
================================================
import 'dart:collection';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_swipe_action_cell/core/cell.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:intl/intl.dart';
import 'package:money_assistant_2608/project/classes/alert_dialog.dart';
import 'package:money_assistant_2608/project/classes/app_bar.dart';
import 'package:money_assistant_2608/project/classes/category_item.dart';
import 'package:money_assistant_2608/project/classes/constants.dart';
import 'package:money_assistant_2608/project/classes/custom_toast.dart';
import 'package:money_assistant_2608/project/classes/input_model.dart';
import 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';
import 'package:money_assistant_2608/project/database_management/sqflite_services.dart';
import 'package:money_assistant_2608/project/localization/methods.dart';
import 'package:table_calendar/table_calendar.dart';
import 'dart:io' show Platform;

import '../classes/input_model.dart';
import 'edit.dart';

class Calendar extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: blue1,
        appBar: BasicAppBar(getTranslated(context, 'Calendar')!),
        body: CalendarBody());
  }
}

class CalendarBody extends StatefulWidget {
  @override
  _CalendarBodyState createState() => _CalendarBodyState();
}

class _CalendarBodyState extends State<CalendarBody> {
  CalendarFormat _calendarFormat = CalendarFormat.month;
  RangeSelectionMode _rangeSelectionMode = RangeSelectionMode
      .toggledOff; // Can be toggled on/off by longpressing a date
  DateTime _focusedDay = DateTime.now(),
      today = DateTime(
          DateTime.now().year, DateTime.now().month, DateTime.now().day);
  DateTime? _selectedDay, _rangeStart, _rangeEnd;
  late Map<DateTime, List<InputModel>> transactions = {};
  late ValueNotifier<List<InputModel>> _selectedEvents;

  @override
  void initState() {
    super.initState();
    _selectedDay = _focusedDay;
  }

  @override
  void dispose() {
    // _calendarController.dispose();
    super.dispose();
  }

  int getHashCode(DateTime key) {
    return key.day * 1000000 + key.month * 10000 + key.year;
  }

  /// Returns a list of [DateTime] objects from [first] to [last], inclusive.
  List<DateTime> daysInRange(DateTime first, DateTime last) {
    final dayCount = last.difference(first).inDays + 1;
    return List.generate(
      dayCount,
      (index) => DateTime.utc(first.year, first.month, first.day + index),
    );
  }

  Widget buildEvents(List<InputModel>? transactions) {
    Color colorCategory;
    if (transactions == null) {
      return Container();
    }
    List<CategoryItem> itemList = createItemList(
      transactions: transactions,
      forAnalysisPage: false,
      forSelectIconPage: false,
      isIncomeType: false,
    );
    return ListView.builder(
        shrinkWrap: true,
        itemCount: itemList.length,
        itemBuilder: (context, int) {
          colorCategory =
              transactions[int].type == 'Income' ? Colors.lightGreen : red;
          return GestureDetector(
              onTap: () {
                Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (context) => Edit(
                              inputModel: transactions[int],
                              categoryIcon: iconData(itemList[int]),
                            ))).then((value) => setState(() {}));
              },
              child: SwipeActionCell(
                key: ObjectKey(transactions[int]),
                performsFirstActionWithFullSwipe: true,
                trailingActions: <SwipeAction>[
                  SwipeAction(
                      title: getTranslated(context, 'Delete') ?? 'Delete',
                      //setState makes handler experience lagging
                      onTap: (CompletionHandler handler)  {
                        Platform.isIOS
                            ? iosDialog(
                                context,
                                'Are you sure you want to delete this transaction?',
                                'Delete', () {
                                DB.delete(transactions[int].id!);
                                setState(() {});
                                customToast(
                                    context, 'Transaction has been deleted');
                              })
                            : androidDialog(
                                context,
                                'Are you sure you want to delete this transaction?',
                                'Delete', () {
                                DB.delete(transactions[int].id!);
                                setState(() {});
                                customToast(
                                    context, 'Transaction has been deleted');
                              });
                      },
                      color: red),
                  SwipeAction(
                      title: getTranslated(context, 'Add') ?? 'Add',
                      onTap: (CompletionHandler handler) {
                        var model = transactions[int];
                        model.id = null;
                        DB.insert(model);
                        setState(() {});
                        customToast(context, 'Transaction has been updated');
                      },
                      color: Color.fromRGBO(255, 183, 121, 1)),
                ],
                child: Column(
                  children: [
                    Container(
                      color: white,
                      child: Padding(
                        padding: EdgeInsets.symmetric(
                            horizontal: 15.w, vertical: 15.h),
                        child: Row(
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          children: [
                            Icon(
                              iconData(itemList[int]),
                              color: colorCategory,
                            ),
                            SizedBox(
                              width: 150.w,
                              child: Padding(
                                padding:
                                    EdgeInsets.only(left: 15.w, right: 10.w),
                                child: Text(
                                    getTranslated(
                                            context, itemList[int].text) ??
                                        itemList[int].text,
                                    style: TextStyle(
                                      fontSize: 18.sp,
                                    ),
                                    overflow: TextOverflow.ellipsis),
                              ),
                            ),
                            Expanded(
                              child: Text('(${transactions[int].description})',
                                  style: TextStyle(
                                      fontSize: 14.sp,
                                      fontStyle: FontStyle.italic),
                                  overflow: TextOverflow.fade),
                            ),
                            //this widget will never overflow
                            Flexible(
                              flex: 0,
                              child: Padding(
                                padding:
                                    EdgeInsets.only(right: 10.w, left: 7.w),
                                child: Text(
                                    format(transactions[int].amount!) +
                                        ' ' +
                                        currency,
                                    style: GoogleFonts.aBeeZee(
                                      fontSize:
                                          format(transactions[int].amount!)
                                                      .length >
                                                  15
                                              ? 16.sp
                                              : 17.sp,
                                    ),
                                    overflow: TextOverflow.ellipsis),
                              ),
                            ),
                            Icon(
                              Icons.arrow_forward_ios,
                              size: 15.5.sp,
                            ),
                          ],
                        ),
                      ),
                    ),
                    Divider(
                      height: 0,
                      thickness: 0.25.h,
                      indent: 20.w,
                      color: grey,
                      // color: Color.fromRGBO(213, 215, 217, 1),
                    ),
                  ],
                ),
              ));
        });
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<InputModel>>(
        initialData: [],
        future: DB.inputModelList(),
        builder: (context, snapshot) {
          connectionUI(snapshot);
          Map<String, List<InputModel>> map = {};
          if (snapshot.data != null) {
            for (int i = 0; i < snapshot.data!.length; i++) {
              String description = snapshot.data![i].description!;
              InputModel map1 = InputModel(
                  id: snapshot.data![i].id,
                  type: snapshot.data![i].type,
                  amount: snapshot.data![i].amount,
                  category: snapshot.data![i].category,
                  description: description,
                  date: snapshot.data![i].date,
                  time: snapshot.data![i].time);

              void updateMapValue<K, V>(Map<K, List<V>> map, K key, V value) =>
                  map.update(key, (list) => list..add(value),
                      ifAbsent: () => [value]);

              updateMapValue(
                map,
                '${snapshot.data![i].date}',
                map1,
              );
            }
            transactions = map.map((key, value) =>
                MapEntry(DateFormat('dd/MM/yyyy').parse(key), value));
          }

          late LinkedHashMap linkedHashedMapTransactions =
              LinkedHashMap<DateTime, List<InputModel>>(
            equals: isSameDay,
            hashCode: getHashCode,
          )..addAll(transactions);

          List<InputModel> transactionsForDay(DateTime? day) =>
              linkedHashedMapTransactions[day] ?? [];

          if (_selectedDay != null) {
            _selectedEvents = ValueNotifier(transactionsForDay(_selectedDay));
          }

          List<InputModel> _getEventsForRange(DateTime start, DateTime end) {
            final days = daysInRange(start, end);

            return [
              for (final d in days) ...transactionsForDay(d),
            ];
          }

          void _onDaySelected(DateTime selectedDay, DateTime focusedDay) {
            if (!isSameDay(_selectedDay, selectedDay)) {
              setState(() {
                _selectedDay = selectedDay;
                _focusedDay = focusedDay;
                _rangeStart = null; // Important to clean those
                _rangeEnd = null;
                _rangeSelectionMode = RangeSelectionMode.toggledOff;
              });
              _selectedEvents.value = transactionsForDay(selectedDay);
            }
          }

          void _onRangeSelected(
              DateTime? start, DateTime? end, DateTime focusedDay) {
            setState(() {
              _selectedDay = null;
              _focusedDay = focusedDay;
              _rangeStart = start;
              _rangeEnd = end;
              _rangeSelectionMode = RangeSelectionMode.toggledOn;
              if (start != null && end != null) {
                _selectedEvents = ValueNotifier(_getEventsForRange(start, end));
              } else if (start != null) {
                _selectedEvents = ValueNotifier(transactionsForDay(start));
              } else if (end != null) {
                _selectedEvents = ValueNotifier(transactionsForDay(end));
              }
            });
          }

          return Column(children: [
            TableCalendar<InputModel>(
              availableCalendarFormats: {
                CalendarFormat.month: getTranslated(context, 'Month')!,
                CalendarFormat.twoWeeks: getTranslated(context, '2 weeks')!,
                CalendarFormat.week: getTranslated(context, 'Week')!
              },
              locale: Localizations.localeOf(context).languageCode,
              // sixWeekMonthsEnforced: true,
              // shouldFillViewport: true,
              rowHeight: 52.h,
              daysOfWeekHeight: 22.h,
              firstDay: DateTime.utc(2000, 01, 01),
              lastDay: DateTime.utc(2050, 01, 01),
              focusedDay: _focusedDay,
              calendarFormat: _calendarFormat,
              selectedDayPredicate: (day) => isSameDay(_selectedDay, day),
              rangeStartDay: _rangeStart,
              rangeEndDay: _rangeEnd,
              rangeSelectionMode: _rangeSelectionMode,
              eventLoader: transactionsForDay,
              startingDayOfWeek: StartingDayOfWeek.monday,
              calendarStyle: CalendarStyle(
                  // weekendTextStyle:
                  // TextStyle().copyWith(color: Colors.blue[800]),
                  ),

              headerStyle: HeaderStyle(
                formatButtonTextStyle: TextStyle(fontSize: 18.sp),
                formatButtonDecoration: BoxDecoration(
                    boxShadow: [BoxShadow()],
                    color: blue2,
                    borderRadius: BorderRadius.circular(25.r)),
              ),
              calendarBuilders: CalendarBuilders(
                selectedBuilder: (context, date, _) {
                  return Container(
                    //see difference between margin and padding below: Margin: Out (for itself), padding: In (for its child)
                    // margin: EdgeInsets.all(4.0.w),
                    padding: EdgeInsets.only(top: 6.0.h, left: 6.0.w),
                    color: Color.fromRGBO(255, 168, 68, 1),
                    width: 46.w,
                    height: 46.h,
                    child: Text(
                      '${date.day}',
                      style: TextStyle().copyWith(fontSize: 17.0.sp),
                    ),
                  );
                },
                todayBuilder: (context, date, _) {
                  return Container(
                    padding: EdgeInsets.only(top: 6.0.w, left: 6.0.w),
                    color: blue2,
                    width: 46.w,
                    height: 46.h,
                    child: Text(
                      '${date.day}',
                      style: TextStyle().copyWith(fontSize: 17.0.sp),
                    ),
                  );
                },
                markerBuilder: (context, date, events) {
                  if (events.isNotEmpty) {
                    return Positioned(
                      right: 1.w,
                      bottom: 1.h,
                      child: _buildEventsMarker(date, events),
                    );
                  }
                },
              ),

              onDaySelected: _onDaySelected,
              onRangeSelected: _onRangeSelected,
              onFormatChanged: (format) {
                if (_calendarFormat != format) {
                  setState(() {
                    _calendarFormat = format;
                  });
                }
              },
              onPageChanged: (focusedDay) {
                _focusedDay = focusedDay;
              },
              pageJumpingEnabled: true,
            ),
            SizedBox(height: 8.0.h),
            Expanded(
              child: ValueListenableBuilder<List<InputModel>>(
                valueListenable: _selectedEvents,
                builder: (context, value, _) {
                  return Column(children: [
                    Balance(value),
                    Expanded(child: buildEvents(value))
                  ]);
                },
              ),
            )
          ]);
        });
  }
}

Widget _buildEventsMarker(DateTime date, List events) {
  double width = events.length < 100 ? 18.w : 28.w;
  return AnimatedContainer(
    duration: const Duration(milliseconds: 300),
    decoration: BoxDecoration(
      shape: BoxShape.rectangle,
      color: Color.fromRGBO(67, 125, 229, 1),
    ),
    width: width,
    height: 18.0.h,
    child: Center(
      child: Text(
        '${events.length}',
        style: TextStyle().copyWith(
          color: white,
          fontSize: 13.0.sp,
        ),
      ),
    ),
  );
}

class Balance extends StatefulWidget {
  final List? events;
  Balance(this.events);
  @override
  _BalanceState createState() => _BalanceState();
}

class _BalanceState extends State<Balance> {
  @override
  Widget build(BuildContext context) {
    double income = 0, expense = 0, balance = 0;
    if (widget.events != null) {
      for (int i = 0; i < widget.events!.length; i++) {
        if (widget.events![i].type == 'Income') {
          income = income + widget.events![i].amount;
        } else {
          expense = expense + widget.events![i].amount;
        }
        balance = income - expense;
      }
    }
    Widget summaryFrame(String type, double amount, color) => Column(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            // this widget will never overflow
            Text(
              getTranslated(context, type)!,
              style: TextStyle(
                  color: color,
                  fontSize: 15.sp,
                  fontStyle: FontStyle.italic,
                  fontWeight: FontWeight.bold),
            ),
            Text(format(amount.toDouble()) + ' ' + currency,
                style: GoogleFonts.aBeeZee(
                    color: color,
                    fontSize: (format(amount.toDouble()).length > 19)
                        ? 11.5.sp
                        : format(amount.toDouble()).length > 14
                            ? 14.sp
                            : 18.sp,
                    fontStyle: FontStyle.italic,
                    fontWeight: FontWeight.bold),
                overflow: TextOverflow.ellipsis)
          ],
        );
    return Container(
      color: Colors.white54,
      height: 69.h,
      child: Padding(
        padding: EdgeInsets.symmetric(horizontal: 15.w, vertical: 10.h),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            summaryFrame(
              'INCOME',
              income,
              Colors.lightGreen,
            ),
            Padding(
                padding: EdgeInsets.symmetric(horizontal: 5.w),
                child: summaryFrame('EXPENSE', expense, red)),
            Flexible(
                child: summaryFrame('TOTAL BALANCE', balance, Colors.black)),
          ],
        ),
      ),
    );
  }
}


================================================
FILE: lib/project/app_pages/currency.dart
================================================
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:money_assistant_2608/project/classes/constants.dart';
import 'package:money_assistant_2608/project/localization/language.dart';
import 'package:money_assistant_2608/project/localization/methods.dart';
import 'package:provider/provider.dart';

import '../provider.dart';

class Currency extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    List<Language> languageList = Language.languageList;
    return Scaffold(
      appBar: AppBar(
          backgroundColor: blue3,
          title: Text(
              getTranslated(context, 'Select a currency') ??
                  'Select a currency',
              style: TextStyle(fontSize: 21.sp)),
          actions: [
            Padding(
              padding: EdgeInsets.only(right: 5.w),
              child: TextButton(
                  child: Text(
                    getTranslated(context, 'Save') ?? 'Save',
                    style: TextStyle(fontSize: 18.5.sp, color: white),
                  ),
                  onPressed: () => Navigator.pop(context)),
            )
          ]),
      body: ChangeNotifierProvider<OnCurrencySelected>(
          create: (context) => OnCurrencySelected(),
          builder: (context, widget) => ListView.builder(
              itemCount: languageList.length,
              itemBuilder: (context, int) {
                return GestureDetector(
                  behavior: HitTestBehavior.translucent,
                  onTap: () {
                    context.read<OnCurrencySelected>().onCurrencySelected(
                        '${languageList[int].languageCode}_${languageList[int].countryCode}');
                  },
                  child: Column(
                    children: [
                      Padding(
                        padding: EdgeInsets.symmetric(
                            horizontal: 15.w, vertical: 10.h),
                        child: Row(
                          children: [
                            Text(
                              Language.languageList[int].flag,
                              style: TextStyle(fontSize: 45.sp),
                            ),
                            SizedBox(width: 30.w),
                            Column(
                              mainAxisAlignment: MainAxisAlignment.start,
                              crossAxisAlignment: CrossAxisAlignment.start,
                              children: [
                                Text(Language.languageList[int].currencyName,
                                    style: TextStyle(fontSize: 20.sp)),
                                SizedBox(height: 2.5.h),
                                Text(Language.languageList[int].currencyCode,
                                    style: TextStyle(fontSize: 15.sp))
                              ],
                            ),
                            Spacer(),
                            context.watch<OnCurrencySelected>().appCurrency ==
                                    '${languageList[int].languageCode}_${languageList[int].countryCode}'
                                ? Icon(Icons.check_circle,
                                    size: 25.sp, color: blue3)
                                : SizedBox(),
                            SizedBox(width: 25.w),
                            Text(
                              Language.languageList[int].currencySymbol,
                              style: TextStyle(fontSize: 23.sp),
                            ),
                            SizedBox(width: 15.w)
                          ],
                        ),
                      ),
                      Divider(
                        indent: 75.w,
                        height: 0,
                        thickness: 0.25.h,
                        color: grey,
                      ),
                    ],
                  ),
                );
              })),
    );
  }
}


================================================
FILE: lib/project/app_pages/edit.dart
================================================
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:money_assistant_2608/project/classes/app_bar.dart';
import 'package:money_assistant_2608/project/classes/constants.dart';
import 'package:money_assistant_2608/project/classes/input_model.dart';
import 'package:money_assistant_2608/project/localization/methods.dart';
import 'input.dart';

class Edit extends StatelessWidget {
  static final _formKey3 = GlobalKey<FormState>(debugLabel: '_formKey3');
  final InputModel? inputModel;
  final IconData categoryIcon;
  const Edit({
    this.inputModel,
    required this.categoryIcon,
  });
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: blue1,
      appBar: BasicAppBar(getTranslated(context, 'Edit')!),
      body: GestureDetector(
        onTap: () {
          FocusScopeNode currentFocus = FocusScope.of(context);
          if (!currentFocus.hasPrimaryFocus) {
            currentFocus.unfocus();
          }
        },
        child: PanelForKeyboard(AddEditInput(
          formKey: _formKey3,
          inputModel: this.inputModel,
          categoryIcon: this.categoryIcon,
        ),)
      ),
    );
  }
}


================================================
FILE: lib/project/app_pages/edit_expense_category.dart
================================================
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:money_assistant_2608/project/classes/app_bar.dart';
import 'package:money_assistant_2608/project/classes/constants.dart';
import 'package:money_assistant_2608/project/localization/methods.dart';
import 'package:provider/provider.dart';

import '../provider.dart';
import 'add_category.dart';
import 'expense_category.dart';

class EditExpenseCategory extends StatefulWidget {
  final BuildContext buildContext;
  EditExpenseCategory(this.buildContext);
  @override
  _EditExpenseCategoryState createState() => _EditExpenseCategoryState();
}

class _EditExpenseCategoryState extends State<EditExpenseCategory> {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<ChangeExpenseItemEdit>(
        create: (context) => ChangeExpenseItemEdit(),
        child: Builder(
            builder: (contextEdit) => Scaffold(
                backgroundColor: blue1,
                appBar: EditCategoryAppBar(
                  AddCategory(
                      contextEx: widget.buildContext,
                      contextExEdit: contextEdit,
                      type: 'Expense',
                      appBarTitle:
                          getTranslated(context, 'Add Expense Category')!,
                      description: ''),
                ),
                body: ExpenseCategoryBody(
                  contextExEdit: contextEdit,
                  contextEx: widget.buildContext,
                ))));
  }
}


================================================
FILE: lib/project/app_pages/edit_income_category.dart
================================================
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:money_assistant_2608'
    '/project/classes/app_bar.dart';
import 'package:money_assistant_2608'
    '/project/classes/constants.dart';
import 'package:money_assistant_2608'
    '/project/localization/methods.dart';
import 'package:provider/provider.dart';
import '../provider.dart';
import 'add_category.dart';
import 'income_category.dart';

class EditIncomeCategory extends StatelessWidget {
  final BuildContext? buildContext;
  EditIncomeCategory(this.buildContext);
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<ChangeIncomeItemEdit>(
        create: (context) => ChangeIncomeItemEdit(),
    child: Builder(
        builder: (contextEdit) => Scaffold(
        backgroundColor: blue1,
        appBar: EditCategoryAppBar(
          AddCategory(
            contextIn: this.buildContext,
            contextInEdit: contextEdit  ,
              type: 'Income',
              appBarTitle: getTranslated(context, 'Add Income Category')!,
              description: ''),
        ),
        body: IncomeCategoryBody( context: this.buildContext, contextEdit: contextEdit,editIncomeCategory: true))));
  }
}


================================================
FILE: lib/project/app_pages/expense_category.dart
================================================
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:money_assistant_2608/project/classes/app_bar.dart';
import 'package:money_assistant_2608/project/classes/category_item.dart';
import 'package:money_assistant_2608/project/classes/constants.dart';
import 'package:money_assistant_2608/project/localization/methods.dart';
import 'package:money_assistant_2608/project/provider.dart';
import 'package:provider/provider.dart';

import 'add_category.dart';
import 'edit_expense_category.dart';

class ExpenseCategory extends StatefulWidget {
  @override
  _ExpenseCategoryState createState() => _ExpenseCategoryState();
}

class _ExpenseCategoryState extends State<ExpenseCategory> {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<ChangeExpenseItem>(
        create: (context) => ChangeExpenseItem(),
        child: Builder(
          builder: (buildContext) => Scaffold(
              backgroundColor: blue1,
              appBar: CategoryAppBar(EditExpenseCategory(buildContext)),
              body: ExpenseCategoryBody(
                contextEx: buildContext,
              )),
        ));
  }
}

class ExpenseCategoryBody extends StatefulWidget {
  final BuildContext? contextExEdit,contextEx;
  ExpenseCategoryBody(
      {this.contextExEdit, this.contextEx});

  @override
  _ExpenseCategoryBodyState createState() => _ExpenseCategoryBodyState();
}

class _ExpenseCategoryBodyState extends State<ExpenseCategoryBody> {
  @override
  Widget build(BuildContext context) {
    var exItemsLists = widget.contextExEdit == null ?
        Provider.of<ChangeExpenseItem>(widget.contextEx!).exItemsLists : Provider.of<ChangeExpenseItemEdit>(widget.contextExEdit!).exItemsLists;
    return SingleChildScrollView(
        child: Padding(
      padding: EdgeInsets.only(left: 10.w, right: 10.w, bottom: 20.h),
      child: Column(
        children: [
          ListView.builder(
              shrinkWrap: true,
              physics: NeverScrollableScrollPhysics(),
              itemCount: exItemsLists.length,
              itemBuilder: (context, int) {
                return Padding(
                  padding: EdgeInsets.only(top: 20.h),
                  child: CategoryContainer( contextEx: widget.contextEx , contextExEdit: widget.contextExEdit,
                      itemsList: exItemsLists[int]),
                );
              }),
        ],
      ),
    ));
  }
}

// The named parameter 'body' is required, but there's no corresponding argument.  Try adding the required argument.
// Widget searchBar() {
//   return FloatingSearchAppBar(
//     title: const Text('Enter Category Name'),
//     transitionDuration: const Duration(milliseconds: 800),
//     color: Colors.orangeAccent.shade100,
//     colorOnScroll: Colors.greenAccent.shade200,
//     height: 55,
//   );
// }

class CategoryContainer extends StatefulWidget {
  final BuildContext? contextEx,contextExEdit;
  final List<CategoryItem> itemsList;
  const CategoryContainer(
  { this.contextEx, this.contextExEdit,  required this.itemsList});
  @override
  _CategoryContainerState createState() => _CategoryContainerState();
}

class _CategoryContainerState extends State<CategoryContainer> {
  @override
  Widget build(BuildContext context) {
    if (widget.itemsList.length < 2) {
      return ParentCategory(
        contextEx:  widget.contextEx,
        contextExEdit: widget.contextExEdit,
        noChildren: true,
        parentCategory:  widget.itemsList[0],
      );
    }
    return Container(
      decoration: BoxDecoration(
        color: white,
        borderRadius: BorderRadius.circular(40.r),
      ),
      child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
        ParentCategory(
          contextEx:  widget.contextEx,
        contextExEdit: widget.contextExEdit,
        noChildren:  false,
          parentCategory:  widget.itemsList[0],
        ),
        CategoryItems(contextEx: widget.contextEx,         contextExEdit: widget.contextExEdit,
            categoryItemChildren:  widget.itemsList.sublist(1),parentItem: widget.itemsList[0]),
      ]),
    );
  }
}

class CategoryItems extends StatefulWidget {
  final BuildContext? contextEx,contextExEdit;
  final List<CategoryItem> categoryItemChildren;
  final CategoryItem parentItem;
  const CategoryItems({this.contextEx, this.contextExEdit,
    required this.categoryItemChildren, required this.parentItem});
  @override
  _CategoryItemsState createState() => _CategoryItemsState();
}

class _CategoryItemsState extends State<CategoryItems> {
  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.only(bottom: 25.h, top: 10.h),
      child: Wrap(
        children: List.generate(widget.categoryItemChildren.length, (index) {
          final cellWidth = (1.sw - 20.w) / 4;
          return SizedBox(
            width: cellWidth,
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisAlignment: MainAxisAlignment.start,
              children: [
                GestureDetector(
                  onLongPress:(){
                    if (widget.contextExEdit != null) {
                      Navigator.push(
                          context,
                          MaterialPageRoute(
                              builder: (context) => AddCategory(
                                  contextEx: widget.contextEx,
                                  contextExEdit: widget.contextExEdit,
                                  type: 'Expense',
                                  appBarTitle: 'Add Expense Category',
                                  categoryName:
                                  widget.categoryItemChildren[index].text,
                                  categoryIcon: iconData(
                                      widget.categoryItemChildren[index]),
                                  parentItem: widget.parentItem,
                                  description: widget
                                      .categoryItemChildren[index]
                                      .description!)));
                    }
                  },
                  onTap: () {
                    if (widget.contextExEdit != null) {
                      Navigator.push(
                          context,
                          MaterialPageRoute(
                              builder: (context) => AddCategory(
                                  contextEx: widget.contextEx,
                                  contextExEdit: widget.contextExEdit,
                                  type: 'Expense',
                                  appBarTitle: 'Add Expense Category',
                                  categoryName:
                                  widget.categoryItemChildren[index].text,
                                  categoryIcon: iconData(
                                      widget.categoryItemChildren[index]),
                                  parentItem: widget.parentItem,
                                  description: widget
                                      .categoryItemChildren[index]
                                      .description!)));
                    } else {
                      Navigator.pop(
                          context, widget.categoryItemChildren[index]);
                    }
                  },
                  child: Padding(
                    padding:  EdgeInsets.symmetric(vertical: 15.h),
                    child: CircleAvatar(
                        radius: 24.r,
                        backgroundColor: Color.fromRGBO(215, 223, 231, 1),
                        child: Icon(
                          iconData(widget.categoryItemChildren[index]),
                          color: red,
                          size: 30.sp,
                        )),
                  ),
                ),
                Text(
                  getTranslated(
                          context, widget.categoryItemChildren[index].text) ??
                      widget.categoryItemChildren[index].text,
                  style: TextStyle(
                    fontSize: 16.sp,
                  ),
                  textAlign: TextAlign.center,
                ),
              ],
            ),
          );
        }),
      ),
    );
  }
}

class ParentCategory extends StatefulWidget {
  final BuildContext? contextEx, contextExEdit;
  final bool noChildren;
  final CategoryItem parentCategory;
  ParentCategory(
  { this.contextEx,
  this.contextExEdit,
    required this.noChildren,
    required this.parentCategory,}
  );
  @override
  _ParentCategoryState createState() => _ParentCategoryState();
}

class _ParentCategoryState extends State<ParentCategory> {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      behavior: HitTestBehavior.translucent,
      onLongPress:(){
        if (widget.contextExEdit != null) {
          Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => AddCategory(
                      contextEx: widget.contextEx,
                      contextExEdit: widget.contextExEdit,
                      type: 'Expense',
                      appBarTitle: 'Add Expense Category',
                      categoryName: widget.parentCategory.text,
                      categoryIcon: iconData(widget.parentCategory),
                      description: widget.parentCategory.description)));
        }
      },
      onTap: () {
        if (widget.contextExEdit != null) {
          Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => AddCategory(
                    contextEx: widget.contextEx,
                      contextExEdit: widget.contextExEdit,
                      type: 'Expense',
                      appBarTitle: 'Add Expense Category',
                      categoryName: widget.parentCategory.text,
                      categoryIcon: iconData(widget.parentCategory),
                      description: widget.parentCategory.description)));
        }
        // consider category as parent category for simplicity, need to change later
        else {
          Navigator.pop(context, widget.parentCategory);
        }
      },
      child: Container(
        decoration: BoxDecoration(
          color: Color.fromRGBO(222, 174, 112, 1),
          borderRadius: widget.noChildren
              ? BorderRadius.circular(40.r)
              : BorderRadius.vertical(
                  top: Radius.circular(40.r), bottom: Radius.zero),
        ),
        child: Padding(
          padding: EdgeInsets.symmetric(vertical: 18.h, horizontal: 15.w),
          child: Row(
            children: [
              CircleAvatar(
                  backgroundColor: Color.fromRGBO(215, 223, 231, 1),
                  radius: 26.r,
                  child: Icon(
                    iconData(widget.parentCategory),
                    size: 33.sp,
                    color: red,
                  )),
              SizedBox(
                width: 23.5.w,
              ),
              Expanded(
                child: Text(
                  getTranslated(context, widget.parentCategory.text) ??
                      widget.parentCategory.text,
                  style:
                      TextStyle(fontSize: 22.sp, fontWeight: FontWeight.bold),
                  overflow: TextOverflow.ellipsis,
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}


================================================
FILE: lib/project/app_pages/income_category.dart
================================================
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:money_assistant_2608/project/classes/app_bar.dart';
import 'package:money_assistant_2608/project/classes/constants.dart';
import 'package:money_assistant_2608/project/localization/methods.dart';
import 'package:money_assistant_2608/project/provider.dart';
import 'package:provider/provider.dart';

import 'add_category.dart';
import 'edit_income_category.dart';

class IncomeCategory extends StatefulWidget {
  @override
  _IncomeCategoryState createState() => _IncomeCategoryState();
}

class _IncomeCategoryState extends State<IncomeCategory> {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<ChangeIncomeItem>(
        create: (context) => ChangeIncomeItem(),
        child: Builder(
            builder: (buildContext) => Scaffold(
                backgroundColor: blue1,
                appBar: CategoryAppBar(EditIncomeCategory(buildContext)),
                body: IncomeCategoryBody(
                    context: buildContext, editIncomeCategory: false))));
  }
}

class IncomeCategoryBody extends StatefulWidget {
  final BuildContext? context, contextEdit;
  final bool editIncomeCategory;
  IncomeCategoryBody(
      {this.context, this.contextEdit, required this.editIncomeCategory});

  @override
  _IncomeCategoryBodyState createState() => _IncomeCategoryBodyState();
}

class _IncomeCategoryBodyState extends State<IncomeCategoryBody> {
  @override
  Widget build(BuildContext context) {
    var incomeList = widget.contextEdit == null
        ? Provider.of<ChangeIncomeItem>(widget.context!).incomeItems
        : Provider.of<ChangeIncomeItemEdit>(widget.contextEdit!).incomeItems;
    return Padding(
      padding: EdgeInsets.only(top: 30.h),
      child: ListView.builder(
        itemCount: incomeList.length,
        itemBuilder: (context, int) {
          return Padding(
            padding: EdgeInsets.only(top: 3.h, left: 10.w, right: 10.w),
            child: GestureDetector(
              onLongPress: () {
                if (this.widget.editIncomeCategory) {
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => AddCategory(
                              contextIn: widget.context,
                              contextInEdit: widget.contextEdit,
                              type: 'Income',
                              appBarTitle: 'Add Income Category',
                              categoryName: incomeList[int].text,
                              categoryIcon: iconData(incomeList[int]),
                              description: incomeList[int].description!)));
                }
              },
              onTap: () {
                if (this.widget.editIncomeCategory) {
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => AddCategory(
                              contextIn: widget.context,
                              contextInEdit: widget.contextEdit,
                              type: 'Income',
                              appBarTitle: 'Add Income Category',
                              categoryName: incomeList[int].text,
                              categoryIcon: iconData(incomeList[int]),
                              description: incomeList[int].description!)));
                } else {
                  Navigator.pop(context, incomeList[int]);
                }
              },
              child: Card(
                elevation: 5,
                color: white,
                shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(35.r),
                ),
                child: Padding(
                  padding: EdgeInsets.symmetric(vertical: 15.h),
                  child: Row(
                    children: [
                      SizedBox(
                        width: 40.h,
                      ),
                      CircleAvatar(
                        backgroundColor: Color.fromRGBO(215, 223, 231, 1),
                        radius: 25.r,
                        child: Icon(
                          iconData(incomeList[int]),
                          size: 33.sp,
                          color: green,
                        ),
                      ),
                      SizedBox(
                        width: 25.w,
                      ),
                      Text(
                        getTranslated(context, incomeList[int].text) ??
                            incomeList[int].text,
                        style: TextStyle(
                            fontSize: 20.sp, fontWeight: FontWeight.bold),
                      )
                    ],
                  ),
                ),
              ),
            ),
          );
        },
      ),
    );
  }
}


================================================
FILE: lib/project/app_pages/input.dart
================================================
import 'dart:core';
import 'dart:io' show Platform;
import 'package:day_night_time_picker/day_night_time_picker.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_material_pickers/flutter_material_pickers.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:intl/intl.dart';
import 'package:keyboard_actions/keyboard_actions.dart';
import 'package:money_assistant_2608/project/classes/alert_dialog.dart';
import 'package:money_assistant_2608/project/classes/app_bar.dart';
import 'package:money_assistant_2608/project/classes/category_item.dart';
import 'package:money_assistant_2608/project/classes/constants.dart';
import 'package:money_assistant_2608/project/classes/custom_toast.dart';
import 'package:money_assistant_2608/project/classes/input_model.dart';
import 'package:money_assistant_2608/project/classes/keyboard.dart';
import 'package:money_assistant_2608/project/classes/saveOrSaveAndDeleteButtons.dart';
import 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';
import 'package:money_assistant_2608/project/database_management/sqflite_services.dart';
import 'package:money_assistant_2608/project/localization/methods.dart';
import 'package:provider/provider.dart';
import 'package:sliding_up_panel/sliding_up_panel.dart';

import '../provider.dart';
import 'expense_category.dart';
import 'income_category.dart';

late CategoryItem defaultCategory;
var selectedTime = TimeOfDay.now();
var selectedDate = DateTime.now();
InputModel model = InputModel();
PanelController _pc = PanelController();
late TextEditingController _amountController;
FocusNode? amountFocusNode, descriptionFocusNode;

class AddInput extends StatefulWidget {
  @override
  _AddInputState createState() => _AddInputState();
}

class _AddInputState extends State<AddInput> {
  static final _formKey1 = GlobalKey<FormState>(debugLabel: '_formKey1'),
      _formKey2 = GlobalKey<FormState>(debugLabel: '_formKey2');

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        FocusScopeNode currentFocus = FocusScope.of(context);
        if (!currentFocus.hasFocus || !currentFocus.hasPrimaryFocus) {
          currentFocus.unfocus();
          if (_pc.isPanelOpen) {
            _pc.close();
          }
        }
      },
      child: DefaultTabController(
          initialIndex: 0,
          length: 2,
          child: Scaffold(
              backgroundColor: blue1,
              appBar: InExAppBar(true),
              body:
                  // ChangeNotifierProvider<ChangeModelType>(
                  //     create: (context) => ChangeModelType(),
                  //     child:
                  PanelForKeyboard(
                TabBarView(
                  children: [
                    AddEditInput(
                      type: 'Expense',
                      formKey: _formKey2,
                    ),
                    AddEditInput(
                      type: 'Income',
                      formKey: _formKey1,
                    )
                  ],
                ),
              ))),
    )
        // )
        ;
  }
}

class PanelForKeyboard extends StatelessWidget {
  const PanelForKeyboard(
    this.body,
  );
  final Widget body;
  void _insertText(String myText) {
    final text = _amountController.text;
    TextSelection textSelection = _amountController.selection;
    String newText = text.replaceRange(
      textSelection.start,
      textSelection.end,
      myText,
    );
    if (newText.length > 13) {
      newText = newText.substring(0, 13);
    }
    // if input starts to have '.' => Don't need to reformat
    if (newText.contains('.')) {
      String fractionalNumber = newText.split('.').last;
      // input can not have more than 2 numbers after a decimal point
      if (fractionalNumber.length > 2) {
        String wholeNumber = newText.split('.').first;
        newText = wholeNumber + '.' + fractionalNumber.substring(0, 2);
      }

      if (newText.substring(newText.length - 1) == '.') {
        // input can not have more than 1 dot
        if ('.'.allMatches(newText).length == 2) {
          newText = newText.substring(0, newText.length - 1);
        }
      }
      _amountController.text = newText;
    } else {
      _amountController.text =
          format(double.parse(newText.replaceAll(',', '')));
    }

    //define text input and cursor position
    textSelection = TextSelection.fromPosition(
        TextPosition(offset: _amountController.text.length));
    _amountController.selection = textSelection;
  }

  void _backspace() {
    final text = _amountController.text;
    TextSelection textSelection = _amountController.selection;

    // The cursor is at the beginning.
    if (textSelection.start == 0) {
      return;
    }

    final selectionLength = textSelection.end - textSelection.start;
    // There is a selection.
    if (selectionLength > 0) {
      final newText = text.replaceRange(
        textSelection.start,
        textSelection.end,
        '',
      );
      // if users delete all input or if input has '.'
      // => Don't need to reformat when deleting
      if (newText == '' || newText.contains('.')) {
        _amountController.text = newText;
      } else {
        _amountController.text =
            format(double.parse(newText.replaceAll(',', '')));
      }

      textSelection = TextSelection.fromPosition(
          TextPosition(offset: _amountController.text.length));
      _amountController.selection = textSelection;
      return;
    }

    // Delete the previous character
    final previousCodeUnit = text.codeUnitAt(textSelection.start - 1);
    final offset = _isUtf16Surrogate(previousCodeUnit) ? 2 : 1;
    final newStart = textSelection.start - offset;
    final newEnd = textSelection.start;
    final newText = text.replaceRange(
      newStart,
      newEnd,
      '',
    );
    if (newText == '' || newText.contains('.')) {
      _amountController.text = newText;
    } else {
      _amountController.text =
          format(double.parse(newText.replaceAll(',', '')));
    }
    textSelection = TextSelection.fromPosition(
        TextPosition(offset: _amountController.text.length));
    _amountController.selection = textSelection;
  }

  bool _isUtf16Surrogate(int value) {
    return value & 0xF800 == 0xD800;
  }

  @override
  Widget build(BuildContext context) {
    return SlidingUpPanel(
        controller: _pc,
        minHeight: 0,
        maxHeight: 300.h,
        parallaxEnabled: true,
        isDraggable: false,
        panelSnapping: true,
        panel: CustomKeyboard(
          panelController: _pc,
          mainFocus: amountFocusNode,
          nextFocus: descriptionFocusNode,
          onTextInput: (myText) {
            _insertText(myText);
          },
          onBackspace: () {
            _backspace();
          },
          page: model.type == 'Income'
              // Provider.of<ChangeModelType>(context).modelType == 'Income'
              ? IncomeCategory()
              : ExpenseCategory(),
        ),
        body: this.body);
  }
}

class AddEditInput extends StatelessWidget {
  final GlobalKey<FormState> formKey;
  final InputModel? inputModel;
  final String? type;
  final IconData? categoryIcon;
  const AddEditInput({
    required this.formKey,
    this.inputModel,
    this.type,
    this.categoryIcon,
  });
  @override
  Widget build(BuildContext context) {
    if (this.inputModel != null) {
      model = this.inputModel!;
      defaultCategory = categoryItem(this.categoryIcon!, model.category!);
      // Provider.of<ChangeModelType>(context, listen: false)
      //     .changeModelType(this.inputModel!.type!);
    } else {
      model = InputModel(
        type: this.type,
      );
      defaultCategory = categoryItem(Icons.category_outlined, 'Category');
      // Provider.of<ChangeModelType>(context, listen: false)
      //     .changeModelType(this.type!);
    }
    return ChangeNotifierProvider<ChangeCategoryA>(
        create: (context) => ChangeCategoryA(),
        child: ListView(children: [
          AmountCard(),
          SizedBox(
            height: 30.h,
          ),
          Container(
            decoration: BoxDecoration(
                color: white,
                border: Border.all(
                  color: grey,
                  width: 0.6.w,
                )),
            child: Column(
              children: [
                CategoryCard(),
                DescriptionCard(),
                DateCard(),
              ],
            ),
          ),
          Padding(
            padding: EdgeInsets.symmetric(vertical: 70.h),
            child: this.inputModel != null
                ? SaveAndDeleteButton(
                    saveAndDeleteInput: true,
                    formKey: this.formKey,
                  )
                : SaveButton(true, null, true),
          )
        ]));
  }
}

class AmountCard extends StatefulWidget {
  @override
  _AmountCardState createState() => _AmountCardState();
}

class _AmountCardState extends State<AmountCard> {
  @override
  void initState() {
    super.initState();
    amountFocusNode = FocusNode();
    _amountController = TextEditingController(
      text: model.id == null ? '' : format(model.amount!),
    );
  }
  // @override
  // void dispose(){
  //   amountFocusNode!.dispose();
  //   super.dispose();
  // }

  @override
  Widget build(BuildContext context) {
    Color colorMain = model.type == 'Income' ? green : red;
    return Container(
      decoration: BoxDecoration(
          color: white,
          border: Border(
              bottom: BorderSide(
            color: grey,
            width: 0.6.h,
          ))),
      child: Padding(
        padding:
            EdgeInsets.only(top: 15.h, bottom: 30.h, right: 20.w, left: 20.w),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.end,
          children: [
            Text(
              '${getTranslated(context, 'Amount')}',
              style: TextStyle(
                fontSize: 22.sp,
              ),
            ),
            TextFormField(
              controller: _amountController,
              readOnly: true,
              showCursor: true,
              maxLines: null,
              minLines: 1,
              // maxLength: ,
              // inputFormatters: [
              //   FilteringTextInputFormatter.allow(
              //       RegExp(r'^\d*(.?|,?)\d{0,2}')),
              // ],
              onTap: () => _pc.open(),
              cursorColor: colorMain,
              style: GoogleFonts.aBeeZee(
                  color: colorMain,
                  fontSize: 35.sp,
                  fontWeight: FontWeight.bold),
              focusNode: amountFocusNode,
              decoration: InputDecoration(
                hintText: '0',
                hintStyle: GoogleFonts.aBeeZee(
                    color: colorMain,
                    fontSize: 35.sp,
                    fontWeight: FontWeight.bold),
                icon: Padding(
                  padding: EdgeInsets.only(right: 5.w),
                  child: Icon(
                    Icons.monetization_on,
                    size: 45.sp,
                    color: colorMain,
                  ),
                ),
                suffixIcon: _amountController.text.length > 0
                    ? IconButton(
                        icon: Icon(
                          Icons.clear,
                          size: 24.sp,
                        ),
                        onPressed: () {
                          _amountController.clear();
                        })
                    : SizedBox(),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class CategoryCard extends StatefulWidget {
  @override
  _CategoryCardState createState() => _CategoryCardState();
}

class _CategoryCardState extends State<CategoryCard> {
  @override
  Widget build(BuildContext context) {
    return Consumer<ChangeCategoryA>(builder: (_, changeCategoryA, __) {
      changeCategoryA.categoryItemA ??= defaultCategory;
      var categoryItem = changeCategoryA.categoryItemA;
      model.category = categoryItem!.text;
      return GestureDetector(
          onTap: () async {
            if (_pc.isPanelOpen) {
              _pc.close();
            }
            CategoryItem newCategoryItem = await Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => model.type == 'Income'
                      ? IncomeCategory()
                      : ExpenseCategory()),
            );
            changeCategoryA.changeCategory(newCategoryItem);
          },
          child: Column(children: [
            Padding(
              padding: EdgeInsets.only(
                  left: 20.w, right: 20.w, top: 20.h, bottom: 21.h),
              child: Row(
                children: [
                  Icon(
                    iconData(categoryItem),
                    size: 40.sp,
                    color: model.type == 'Income' ? green : red,
                  ),
                  Expanded(
                    child: Padding(
                      padding: EdgeInsets.only(left: 31.w),
                      child: Text(
                        getTranslated(context, categoryItem.text) ??
                            categoryItem.text,
                        style: TextStyle(
                          fontSize: 24.sp,
                          fontWeight: FontWeight.bold,
                        ),
                        overflow: TextOverflow.ellipsis,
                      ),
                    ),
                  ),
                  // Spacer(),
                  Icon(
                    Icons.arrow_forward_ios_outlined,
                    size: 20.sp,
                  ),
                ],
              ),
            ),
            Divider(
              height: 0,
              thickness: 0.25.w,
              color: grey,
              indent: 85.w,
            ),
          ]));
    });
  }
}

class DescriptionCard extends StatefulWidget {
  @override
  _DescriptionCardState createState() => _DescriptionCardState();
}

class _DescriptionCardState extends State<DescriptionCard> {
  static late TextEditingController descriptionController;

  @override
  void initState() {
    super.initState();
    descriptionFocusNode = FocusNode();
    descriptionController =
        TextEditingController(text: model.description ?? '');
  }

  // @override
  // void dispose(){
  //   descriptionFocusNode!.dispose();
  //   super.dispose();
  // }

  KeyboardActionsConfig _buildConfig(BuildContext context) {
    return KeyboardActionsConfig(
        nextFocus: false,
        keyboardActionsPlatform: KeyboardActionsPlatform.ALL,
        keyboardBarColor: Colors.grey[200],
        actions: [
          KeyboardActionsItem(
              focusNode: descriptionFocusNode!,
              toolbarButtons: [
                (node) {
                  return SizedBox(
                    width: 1.sw,
                    child: Padding(
                        padding: EdgeInsets.only(left: 5.w, right: 16.w),
                        child: Row(
                          mainAxisAlignment: MainAxisAlignment.spaceBetween,
                          children: [
                            GestureDetector(
                              onTap: () {
                                FocusScope.of(context)
                                    .requestFocus(amountFocusNode);
                                _pc.open();
                              },
                              child: SizedBox(
                                height: 35.h,
                                width: 60.w,
                                child: Icon(Icons.keyboard_arrow_up,
                                    size: 25.sp, color: Colors.blueGrey),
                              ),
                            ),
                            // GestureDetector(
                            //   onTap: () {
                            //     node.unfocus();
                            //     Navigator.push(
                            //         context,
                            //         MaterialPageRoute(
                            //             builder: (context) => model.type == 'Income'
                            //                 ? IncomeCategory()
                            //                 : ExpenseCategory()));
                            //   },
                            //   child: Text(
                            //     getTranslated(context, 'Choose Category')!,
                            //     style: TextStyle(
                            //         fontSize: 16.sp,
                            //         fontWeight: FontWeight.bold,
                            //         color: Colors.blueGrey),
                            //   ),
                            // ),
                            GestureDetector(
                                onTap: () => node.unfocus(),
                                child: Text(
                                  getTranslated(context, "Done")!,
                                  style: TextStyle(
                                      fontSize: 16.sp,
                                      fontWeight: FontWeight.bold,
                                      color: Colors.blue),
                                ))
                          ],
                        )),
                  );
                },
              ])
        ]);
  }

  @override
  Widget build(BuildContext context) {
    return KeyboardActions(
      overscroll: 0,
      disableScroll: true,
      tapOutsideBehavior: TapOutsideBehavior.translucentDismiss,
      autoScroll: false,
      config: _buildConfig(context),
      child: Column(children: [
        Padding(
          padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 8.5.h),
          child: TextFormField(
            controller: descriptionController,
            maxLines: null,
            minLines: 1,
            keyboardType: TextInputType.multiline,
            keyboardAppearance: Brightness.light,
            // maxLength: ,
            onTap: () {
              if (_pc.isPanelOpen) {
                _pc.close();
              }
            },
            cursorColor: blue1,
            textCapitalization: TextCapitalization.sentences,
            style: TextStyle(fontSize: 20.sp),
            focusNode: descriptionFocusNode,
            textInputAction: TextInputAction.newline,
            decoration: InputDecoration(
                border: InputBorder.none,
                hintText: getTranslated(context, 'Description'),
                hintStyle: GoogleFonts.cousine(
                  fontSize: 22.sp,
                  fontStyle: FontStyle.italic,
                ),
                suffixIcon: descriptionController.text.length > 0
                    ? IconButton(
                        icon: Icon(
                          Icons.clear,
                          size: 20.sp,
                        ),
                        onPressed: () {
                          descriptionController.clear();
                        })
                    : SizedBox(),
                icon: Padding(
                  padding: EdgeInsets.only(right: 15.w),
                  child: Icon(
                    Icons.description_outlined,
                    size: 40.sp,
                    color: Colors.blueGrey,
                  ),
                )),
          ),
        ),
        Divider(
          height: 0,
          thickness: 0.25.w,
          color: grey,
          indent: 85.w,
        )
      ]),
    );
  }
}

class DateCard extends StatefulWidget {
  const DateCard();
  @override
  _DateCardState createState() => _DateCardState();
}

class _DateCardState extends State<DateCard> {
  @override
  Widget build(BuildContext context) {
    if (model.date == null) {
      model.date = DateFormat('dd/MM/yyyy').format(selectedDate);
      model.time = selectedTime.format(context);
    }
    return Padding(
      padding:
          EdgeInsets.only(left: 20.w, right: 20.w, top: 17.5.h, bottom: 19.h),
      child: Row(
        children: [
          GestureDetector(
            onTap: () {
              if (_pc.isPanelOpen) {
                _pc.close();
              }
              showMaterialDatePicker(
                headerColor: blue3,
                headerTextColor: Colors.black,
                backgroundColor: white,
                buttonTextColor: Color.fromRGBO(80, 157, 253, 1),
                cancelText: getTranslated(context, 'CANCEL'),
                confirmText: getTranslated(context, 'OK') ?? 'OK',
                maxLongSide: 450.w,
                maxShortSide: 300.w,
                title: getTranslated(context, 'Select a date'),
                context: context,
                firstDate: DateTime(1990, 1, 1),
                lastDate: DateTime(2050, 12, 31),
                selectedDate: DateFormat('dd/MM/yyyy').parse(model.date!),
                onChanged: (value) => setState(() {
                  selectedDate = value;
                  model.date = DateFormat('dd/MM/yyyy').format(value);
                }),
              );
            },
            child: Row(
              mainAxisSize: MainAxisSize.min,
              children: [
                Padding(
                  padding: EdgeInsets.only(right: 30.w),
                  child: Icon(
                    Icons.event,
                    size: 40.sp,
                    color: Colors.blue,
                  ),
                ),
                Text(
                  DateFormat(sharedPrefs.dateFormat).format(
                      DateFormat('dd/MM/yyyy').parse(
                          model.date!)),
                  style: GoogleFonts.aBeeZee(
                    fontSize: 21.5.sp,
                  ),
                ),
              ],
            ),
          ),
          Spacer(),
          GestureDetector(
            behavior: HitTestBehavior.translucent,
            onTap: () {
              if (_pc.isPanelOpen) {
                _pc.close();
              }
              Navigator.of(context).push(
                showPicker(
                    cancelText: getTranslated(context, 'Cancel') ?? 'Cancel',
                    okText: getTranslated(context, 'Ok') ?? 'Ok',
                    unselectedColor: grey,
                    dialogInsetPadding: EdgeInsets.symmetric(
                        horizontal: 50.w, vertical: 30.0.h),
                    elevation: 12,
                    context: context,
                    value: selectedTime,
                    is24HrFormat: true,
                    onChange: (value) => setState(() {
                          selectedTime = value;
                          model.time = value.format(context);
                        })),
              );
            },
            child: Text(
              model.time!,
              style: GoogleFonts.aBeeZee(
                fontSize: 21.5.sp,
              ),
            ),
          )
        ],
      ),
    );
  }
}

void saveInputFunc(BuildContext context, bool saveFunction) {
  model.amount = _amountController.text.isEmpty
      ? 0
      : double.parse(_amountController.text.replaceAll(',', ''));
  model.description = _DescriptionCardState.descriptionController.text;
  if (saveFunction) {
    DB.insert(model);
    _amountController.clear();
    if (_DescriptionCardState.descriptionController.text.length > 0) {
      _DescriptionCardState.descriptionController.clear();
    }
    customToast(context, 'Data has been saved');
  } else {
    DB.update(model);
    Navigator.pop(context);
    customToast(context, getTranslated(context, 'Transaction has been updated') ?? 'Transaction has been updated');
  }
}

Future<void> deleteInputFunction(
  BuildContext context,
) async {
  void onDeletion() {
    DB.delete(model.id!);
    Navigator.pop(context);
    customToast(context, 'Transaction has been deleted');
  }

  Platform.isIOS
      ? await iosDialog(
          context,
          'Are you sure you want to delete this transaction?',
          'Delete',
          onDeletion)
      : await androidDialog(
          context,
          'Are you sure you want to delete this transaction?',
          'Delete',
          onDeletion);
}


================================================
FILE: lib/project/app_pages/others.dart
================================================
import 'dart:core';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:in_app_review/in_app_review.dart';
import 'package:intl/intl.dart';
import 'package:money_assistant_2608/project/app_pages/select_date_format.dart';
import 'package:money_assistant_2608/project/app_pages/select_language.dart';
import 'package:money_assistant_2608/project/auth_pages/user_account.dart';
import 'package:money_assistant_2608/project/classes/alert_dialog.dart';
import 'package:money_assistant_2608/project/classes/constants.dart';
import 'package:money_assistant_2608/project/classes/custom_toast.dart';
import 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';
import 'package:money_assistant_2608/project/database_management/sqflite_services.dart';
import 'package:money_assistant_2608/project/localization/methods.dart';
import 'package:provider/provider.dart';
import 'package:share_plus/share_plus.dart';
import 'dart:io' show Platform;
import '../provider.dart';
import 'currency.dart';

class Other extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        primary: true,
        appBar: PreferredSize(
          preferredSize: Size.fromHeight(
            150.h,
          ),
          child: Container(
            color: blue3,
            padding: EdgeInsets.symmetric(horizontal: 20.w, vertical: 0),
            height: 200.h,
            child: Padding(
              padding: EdgeInsets.only(top: 30.w),
              child: Row(
                children: [
                  CircleAvatar(
                    child: CircleAvatar(
                        child: Icon(
                          FontAwesomeIcons.smileBeam,
                          color: Colors.black,
                          size: 71.sp,
                        ),
                        radius: 35.r,
                        backgroundColor: blue1),
                    radius: 40.r,
                    backgroundColor: Colors.orangeAccent,
                  ),
                  SizedBox(
                    width: 20.w,
                  ),
                  Text(
                    '${getTranslated(context, 'Hi you')!}!',
                    style: TextStyle(fontSize: 30.sp),
                  ),
                  // Spacer(),
                  // Icon(
                  //   Icons.notifications_rounded,
                  //   size: 25.sp,
                  // )
                ],
              ),
            ),
          ),
        ),
        body: ChangeNotifierProvider<OnSwitch>(
            create: (context) => OnSwitch(),
            builder: (context, widget) => Settings(providerContext: context)));
  }
}

class Settings extends StatefulWidget {
  final BuildContext providerContext;
  const Settings({required this.providerContext});

  @override
  State<Settings> createState() => _SettingsState();
}

class _SettingsState extends State<Settings> {
  @override
  Widget build(BuildContext context) {
    List<Widget> pageRoute = [
      UserAccount(),
      SelectLanguage(),
      Currency(),
    ];
    List<Widget> settingsIcons = [
      Icon(
        Icons.account_circle,
        size: 35,
        color: Colors.lightBlue,
      ),
      // Icon(
      //   Icons.settings,
      //   size: 32,
      //   color: Colors.blueGrey[800],
      // ),
      // Icon(
      //   Icons.feedback,
      //   size: 35.sp,
      //   color: Colors.black54,
      // ),
      Icon(
        Icons.language,
        size: 32.sp,
        color: Colors.lightBlue,
      ),
      Icon(
        Icons.monetization_on,
        size: 32.sp,
        color: Colors.orangeAccent,
      ),
      Icon(Icons.format_align_center, size: 32.sp, color: Colors.lightBlue),
      Icon(Icons.refresh, size: 32.sp, color: Colors.lightBlue),
      Icon(Icons.delete_forever, size: 32.sp, color: red),
      // Icon(Icons.lock, size: 32.sp, color: Colors.blueGrey),
      Icon(
        Icons.share,
        size: 28.sp,
        color: Colors.lightBlue,
      ),
      Icon(
        Icons.star,
        size: 32.sp,
        color: Colors.amber,
      ),
    ];
    List<String> settingsList = [
      getTranslated(context, 'My Account')!,
      // getTranslated(context, 'General Settings')!,
      // getTranslated(context, 'Feedback')!,
      getTranslated(context, 'Language') ?? 'Language',
      getTranslated(context, 'Currency') ?? 'Currency',
      (getTranslated(context, 'Date format') ??
          'Date format') +
              ' (${DateFormat(sharedPrefs.dateFormat).format(now)})',
      getTranslated(context, 'Reset All Categories') ?? 'Reset All Categories',
      getTranslated(context, 'Delete All Data') ?? 'Delete All Data',
      // getTranslated(context, 'Enable Passcode') ?? 'Enable Passcode',
      getTranslated(context, 'Share Friends') ?? 'Share Friends',
      getTranslated(context, 'Rate App') ?? 'Rate App',
    ];

    return ListView.builder(
        itemCount: settingsList.length,
        itemBuilder: (context, int) {
          // void onPasscodeSwitched() {
          //   context.read<OnSwitch>().onSwitch();
          //   if (context.read<OnSwitch>().isPasscodeOn) {
          //     showDialog<void>(
          //         context: context,
          //         builder: (providerContext) =>
          //             OtherLockScreen(providerContext: this.providerContext));
          //   } else {
          //    customToast(context, 'Passcode has been disabled');
          //   }
          // }

          return GestureDetector(
            onTap: () async {
              if ((int == 0) || (int == 1) || (int == 2)) {
                Navigator.push(context,
                    MaterialPageRoute(builder: (context) => pageRoute[int]));
              } else if (int == 3) {
                Navigator.push(context,
                        MaterialPageRoute(builder: (context) => FormatDate()))
                    .then((value) => setState(() {}));
              } else if (int == 4) {
                // Navigator.push(
                //     context,
                //     MaterialPageRoute(
                //         builder: (context) => EditIncomeCategory(null)));
                void onReset() {
                  sharedPrefs.setItems(setCategoriesToDefault: true);
                  customToast(context, 'Categories have been reset');
                }

                Platform.isIOS
                    ? await iosDialog(
                        context,
                        'This action cannot be undone. Are you sure you want to reset all categories?',
                        'Reset',
                        onReset)
                    : await androidDialog(
                        context,
                        'This action cannot be undone. Are you sure you want to reset all categories?',
                        'reset',
                        onReset);
              } else if (int == 5) {
                Future onDeletion() async {
                  await DB.deleteAll();
                  customToast(context, 'All data has been deleted');
                }

                Platform.isIOS
                    ? await iosDialog(
                        context,
                        'Deleted data can not be recovered. Are you sure you want to delete all data?',
                        'Delete',
                        onDeletion)
                    : await androidDialog(
                        context,
                        'Deleted data can not be recovered. Are you sure you want to delete all data?',
                        'Delete',
                        onDeletion);
              }
              // else if (int == 4) {
              //   onPasscodeSwitched();
              // }
              else if (int == 6) {
                Share.share(
                    'https://apps.apple.com/us/app/mmas-money-tracker-bookkeeper/id1582638369');
              } else {
                final InAppReview inAppReview = InAppReview.instance;
                await inAppReview.openStoreListing(
                  appStoreId: Platform.isIOS
                      ? '1582638369'
                      : 'com.mmas.money_assistant_2608',
                );
              }
            },
            child: Column(
              children: [
                Padding(
                  padding: EdgeInsets.symmetric(vertical: 7.h),
                  child: SizedBox(
                    child: Center(
                        child: ListTile(
                      title: Padding(
                        padding: EdgeInsets.symmetric(horizontal: 8.w),
                        child: Text(
                          '${settingsList[int]}',
                          style: TextStyle(fontSize: 18.5.sp),
                        ),
                      ),
                      leading: CircleAvatar(
                          radius: 24.r,
                          backgroundColor: Color.fromRGBO(229, 231, 234, 1),
                          child: settingsIcons[int]),
                      trailing:
                          // int == 4
                          // ? Switch(
                          //     value: context.watch<OnSwitch>().isPasscodeOn,
                          //     onChanged: (value) {
                          //       onPasscodeSwitched();
                          //     },
                          //     activeTrackColor: blue1,
                          //     activeColor: Color.fromRGBO(71, 131, 192, 1),
                          //   ) :
                          Icon(
                        Icons.arrow_forward_ios,
                        size: 20.sp,
                        color: Colors.blueGrey,
                      ),
                    )),
                  ),
                ),
                Divider(
                  indent: 78.w,
                  height: 0.1.h,
                  thickness: 0.4.h,
                  color: grey,
                ),
              ],
            ),
          );
        });
  }
}

// class Upgrade extends StatelessWidget {
//   @override
//   Widget build(BuildContext context) {
//     return Stack(
//       alignment: Alignment.center,
//       children: [
//         Container(
//           height: 165.h,
//           color: Color.fromRGBO(234, 234, 234, 1),
//         ),
//         Container(
//           alignment: Alignment.center,
//           height: 115.h,
//           decoration: BoxDecoration(
//               image: DecorationImage(
//                   fit: BoxFit.fill, image: AssetImage('images/image13.jpg'))),
//         ),
//         Container(
//           alignment: Alignment.center,
//           decoration: BoxDecoration(
//               color: Color.fromRGBO(255, 255, 255, 1),
//               borderRadius: BorderRadius.circular(40),
//               border: Border.all(
//                 color: Colors.grey,
//                 width: 0.5.w,
//               )),
//           height: 55.h,
//           width: 260.w,
//           child: Text(
//             getTranslated(context, 'VIEW UPGRADE OPTIONS')!,
//             style: TextStyle(fontSize: 4.206, fontWeight: FontWeight.bold),
//           ),
//         ),
//       ],
//     );
//   }
// }


================================================
FILE: lib/project/app_pages/parent_category.dart
================================================
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:money_assistant_2608/project/classes/app_bar.dart';
import 'package:money_assistant_2608/project/classes/category_item.dart';
import 'package:money_assistant_2608/project/classes/constants.dart';
import 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';
import 'package:money_assistant_2608/project/localization/methods.dart';

class ParentCategoryList extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    List<CategoryItem> parentCategories = sharedPrefs.getAllExpenseItemsLists()
        .map((item) => CategoryItem(
            item[0].iconCodePoint,
            item[0].iconFontPackage,
            item[0].iconFontFamily,
            item[0].text,
            item[0].description))
        .toList();
    return Scaffold(
      appBar: BasicAppBar(getTranslated(context, 'Parent category')!),
      body: ListView.builder(
        itemCount: parentCategories.length,
        itemBuilder: (context, int) {
          return GestureDetector(
              behavior: HitTestBehavior.translucent,
              onTap: () {
                Navigator.pop(
                    context,
                    parentCategories[int]);
              },
              child: Column(
                children: [
                  Padding(
                    padding:
                        EdgeInsets.symmetric(horizontal: 10.w, vertical: 5.h),
                    child: Row(
                      children: [
                        CircleAvatar(
                            backgroundColor: Color.fromRGBO(215, 223, 231, 1),
                            radius: 20.r,
                            child: Icon(
                              iconData(parentCategories[int]),
                              size: 25.sp,
                              color: red,
                            )),
                        SizedBox(
                          width: 28.w,
                        ),
                        Expanded(
                          child: Text(
                            getTranslated(context, parentCategories[int].text) ??
                                parentCategories[int].text,
                            style: TextStyle(fontSize: 22.sp),
                            overflow: TextOverflow.ellipsis,
                          ),
                        )
                      ],
                    ),
                  ),
                  Divider(
                    thickness: 0.25.h,
                    indent: 67.w,
                    color: grey,
                  )
                ],
              ));
        },
      ),
    );
  }
}


================================================
FILE: lib/project/app_pages/report.dart
================================================
/// Package import
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_swipe_action_cell/core/cell.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:intl/intl.dart';
import 'package:money_assistant_2608/project/classes/alert_dialog.dart';
import 'package:money_assistant_2608/project/classes/app_bar.dart';
import 'package:money_assistant_2608/project/classes/constants.dart';
import 'package:money_assistant_2608/project/classes/custom_toast.dart';
import 'package:money_assistant_2608/project/classes/input_model.dart';
import 'package:money_assistant_2608/project/classes/dropdown_box.dart';
import 'package:money_assistant_2608/project/database_management/shared_preferences_services.dart';
import 'package:money_assistant_2608/project/database_management/sqflite_services.dart';
import 'package:money_assistant_2608/project/localization/methods.dart';
import 'package:money_assistant_2608/project/provider.dart';
import 'package:provider/provider.dart';
import 'dart:io' show Platform;

/// Chart import
import 'package:syncfusion_flutter_charts/charts.dart';

import 'edit.dart';

var year = todayDT.year;

class Report extends StatefulWidget {
  final String type;
  final String category;
  final String selectedDate;
  final IconData icon;
  const Report({
    required this.type,
    required this.category,
    required this.selectedDate,
    required this.icon,
  });

  @override
  _ReportState createState() => _ReportState();
}

class _ReportState extends State<Report> {
  @override
  Widget build(BuildContext context) {
    Color color = widget.type == getTranslated(context, 'Income') ? green : red;

    return Scaffold(
      backgroundColor: blue1,
      appBar: BasicAppBar(getTranslated(context, 'Report')!),
      body: Column(
        children: [
          Padding(
            padding: EdgeInsets.only(
              top: 17.h,
              bottom: 15.h,
              left: 7.w,
              right: 7.w,
            ),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Padding(
                  padding: EdgeInsets.only(right: 15.w),
                  child: Icon(this.widget.icon, size: 30.sp, color: color),
                ),
                Flexible(
                  child: Text(
                    '${getTranslated(context, widget.category) ?? widget.category} ($year)',
                    style: TextStyle(
                        fontSize: 24.sp,
                        fontWeight: FontWeight.bold,
                        color: color),
                    overflow: TextOverflow.ellipsis,
                  ),
                )
              ],
            ),
          ),
          Expanded(
            child: ReportBody(widget.type, widget.category, widget.selectedDate,
                color, widget.icon),
          )
        ],
      ),
    );
  }
}

class ReportBody extends StatefulWidget {
  final String type;
  final String category;
  final String selectedDate;
  final Color color;
  final IconData icon;
  ReportBody(
      this.type, this.category, this.selectedDate, this.color, this.icon);
  @override
  _ReportBodyState createState() => _ReportBodyState();
}

class _ReportBodyState extends State<ReportBody> {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
        create: (context) => InputModelList(),
        builder: (context, child) {
          return FutureBuilder<List<InputModel>>(
              initialData: [],
              future: Provider.of<InputModelList>(context).inputModelList,
              builder: (BuildContext context,
                  AsyncSnapshot<List<InputModel>> snapshot) {
                connectionUI(snapshot);
                if (snapshot.data == null ||
                    snapshot.connectionState == ConnectionState.waiting) {
                  return SizedBox();
                } else {
                  double yearAmount = 0;
                  DateTime date(int duration) =>
                      startOfThisYear.add(Duration(days: duration));
                  bool isLeapYear(int year) {
                    return (year % 4 == 0) && (year % 100 != 0) ||
                        (year % 400 == 0);
                  }

                  // widget.transactions.sort((a, b) => a.date!.compareTo(b.date!));
                  List<InputModel> sortByCategory(
                      List<InputModel> data, String type) {
                    return data
                        .map((data) {
                          if (data.type == type &&
                              data.category == widget.category) {
                            return inputModel(data);
                          }
                        })
                        .where((element) => element != null)
                        .toList()
                        .cast<InputModel>();
                  }

                  List<InputModel> transactions = widget.type == 'Income'
                      ? sortByCategory(snapshot.data!, 'Income')
                      : sortByCategory(snapshot.data!, 'Expense');

                  List<InputModel> transactionsYearly = (transactions
                          .map((data) {
                            DateTime dateSelectedDT =
                                DateFormat('dd/MM/yyyy').parse(data.date!);

                            if (dateSelectedDT.isAfter(startOfThisYear
                                    .subtract(Duration(days: 1))) &&
                                dateSelectedDT
                                    .isBefore(DateTime(todayDT.year, 12, 31))) {
                              return inputModel(data);
                            }
                          })
                          .where((element) => element != null)
                          .toList())
                      .cast<InputModel>();

                  if (transactionsYearly.length > 0) {
                    for (InputModel? transaction in transactionsYearly) {
                      yearAmount = yearAmount + transaction!.amount!;
                    }
                  }

                  MonthAmount monthBasedTransaction(
                      String month, DateTime date, int days) {
                    double monthAmount = 0;
                    for (InputModel transaction in transactionsYearly) {
                      DateTime dateSelectedDT =
                          DateFormat('dd/MM/yyyy').parse(transaction.date!);

                      if (dateSelectedDT.isAfter(date) &&
                          dateSelectedDT.isBefore(
                              startOfThisYear.add(Duration(days: days)))) {
                        transaction.amount ??= 0;
                        monthAmount = monthAmount + transaction.amount!;
                      }
                    }
                    return MonthAmount(month, monthAmount);
                  }

                  List<MonthAmount>? monthBasedTransactionList =
                      isLeapYear(year)
                          ? []
                          : [
                              monthBasedTransaction(
                                  'Jan',
                                  startOfThisYear.subtract(Duration(days: 1)),
                                  30),
                              monthBasedTransaction('Feb', date(30), 58),
                              monthBasedTransaction('Mar', date(58), 89),
                              monthBasedTransaction('Apr', date(89), 119),
                              monthBasedTransaction('May', date(119), 150),
                              monthBasedTransaction('Jun', date(150), 180),
                              monthBasedTransaction('Jul', date(180), 211),
                              monthBasedTransaction('Aug', date(211), 242),
                              monthBasedTransaction('Sep', date(242), 272),
                              monthBasedTransaction('Oct', date(272), 302),
                              monthBasedTransaction('Nov', date(302), 333),
                              monthBasedTransaction('Dec', date(333), 364),
                            ];

                  double maximumMonthAmount =
                      monthBasedTransactionList[0].amount;
                  for (int i = 0; i < monthBasedTransactionList.length; i++) {
                    if (monthBasedTransactionList[i].amount >
                        maximumMonthAmount) {
                      maximumMonthAmount = monthBasedTransactionList[i].amount;
                    }
                  }

                  return Column(
                    children: [
                      Padding(
                        padding: EdgeInsets.only(right: 8.0.w),
                        child: SizedBox(
                          height: 280.h,
                          child: SfCartesianChart(
                            primaryXAxis: CategoryAxis(
                                // placeLabelsNearAxisLine: true,
                                // edgeLabelPlacement: EdgeLabelPlacement.none,
                                // majorTickLines: MajorTickLines(size: 5, width: 1),
                                axisLine: AxisLine(
                                  width: 3.h,
                                ),
                                labelPlacement: LabelPlacement.onTicks,
                                isVisible: true,
                                labelRotation: -45,
                                rangePadding: ChartRangePadding.none,
                                majorGridLines: MajorGridLines(width: 0)),
                            // tooltipBehavior: _tooltipBehavior,
                            primaryYAxis: NumericAxis(
                                majorGridLines: MajorGridLines(width: 0),
                                minimum: 0,
                                maximum: maximumMonthAmount,
                                labelFormat: '{value}',
                                axisLine: AxisLine(
                                  width: 4.h,
                                ),
                                majorTickLines: MajorTickLines(size: 5.sp)),
                            series: _getGradientAreaSeries(
                                this.widget.type, monthBasedTransactionList),
                            onMarkerRender: (MarkerRenderArgs args) {
                              if (this.widget.type == 'Income') {
                                if (args.pointIndex == 0) {
                                  args.color =
                                      const Color.fromRGBO(9, 110, 16, 1);
                                } else if (args.pointIndex == 1) {
                                  args.color =
                                      const Color.fromRGBO(19, 134, 13, 1);
                                } else if (args.pointIndex == 2) {
                                  args.color =
                                      const Color.fromRGBO(55, 171, 49, 1);
                                } else if (args.pointIndex == 3) {
                                  args
Download .txt
gitextract_sxwtmaf3/

├── .gitignore
├── .metadata
├── LICENSE
├── README.md
├── android/
│   ├── .gitignore
│   ├── app/
│   │   ├── build.gradle
│   │   └── src/
│   │       ├── debug/
│   │       │   └── AndroidManifest.xml
│   │       ├── main/
│   │       │   ├── AndroidManifest.xml
│   │       │   ├── kotlin/
│   │       │   │   └── com/
│   │       │   │       └── mmas/
│   │       │   │           └── money_assistant_2608/
│   │       │   │               └── MainActivity.kt
│   │       │   └── res/
│   │       │       ├── drawable/
│   │       │       │   └── launch_background.xml
│   │       │       ├── drawable-v21/
│   │       │       │   └── launch_background.xml
│   │       │       ├── values/
│   │       │       │   └── styles.xml
│   │       │       └── values-night/
│   │       │           └── styles.xml
│   │       └── profile/
│   │           └── AndroidManifest.xml
│   ├── build.gradle
│   ├── gradle/
│   │   └── wrapper/
│   │       └── gradle-wrapper.properties
│   ├── gradle.properties
│   └── settings.gradle
├── flutter
├── ios/
│   ├── .gitignore
│   ├── Flutter/
│   │   ├── AppFrameworkInfo.plist
│   │   ├── Debug.xcconfig
│   │   └── Release.xcconfig
│   ├── Podfile
│   ├── Runner/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   ├── AppIcon.appiconset/
│   │   │   │   └── Contents.json
│   │   │   ├── LaunchBackground.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── LaunchImage.imageset/
│   │   │       ├── Contents.json
│   │   │       └── README.md
│   │   ├── Base.lproj/
│   │   │   ├── LaunchScreen.storyboard
│   │   │   └── Main.storyboard
│   │   ├── GoogleService-Info.plist
│   │   ├── Info.plist
│   │   ├── Runner-Bridging-Header.h
│   │   └── Runner.entitlements
│   ├── Runner.xcodeproj/
│   │   ├── project.pbxproj
│   │   ├── project.xcworkspace/
│   │   │   ├── contents.xcworkspacedata
│   │   │   └── xcshareddata/
│   │   │       ├── IDEWorkspaceChecks.plist
│   │   │       └── WorkspaceSettings.xcsettings
│   │   └── xcshareddata/
│   │       └── xcschemes/
│   │           └── Runner.xcscheme
│   ├── Runner.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── WorkspaceSettings.xcsettings
│   └── build/
│       └── Pods.build/
│           └── Release-iphonesimulator/
│               ├── DKImagePickerController-DKImagePickerController.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── DKImagePickerController.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── DKPhotoGallery-DKPhotoGallery.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── DKPhotoGallery.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── FMDB.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── Flutter.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── Pods-Runner.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── SDWebImage.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── SwiftyGif.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── Toast.build/
│               │   └── dgph
│               ├── file_picker.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── fluttertoast.build/
│               │   └── dgph
│               ├── in_app_review.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── local_auth.build/
│               │   └── dgph
│               ├── path_provider.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── rate_my_app.build/
│               │   └── dgph
│               ├── share_plus.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── shared_preferences.build/
│               │   ├── dgph
│               │   └── dgph~
│               ├── sqflite.build/
│               │   ├── dgph
│               │   └── dgph~
│               └── url_launcher.build/
│                   ├── dgph
│                   └── dgph~
├── lib/
│   ├── main.dart
│   └── project/
│       ├── app_pages/
│       │   ├── add_category.dart
│       │   ├── analysis.dart
│       │   ├── calendar.dart
│       │   ├── currency.dart
│       │   ├── edit.dart
│       │   ├── edit_expense_category.dart
│       │   ├── edit_income_category.dart
│       │   ├── expense_category.dart
│       │   ├── income_category.dart
│       │   ├── input.dart
│       │   ├── others.dart
│       │   ├── parent_category.dart
│       │   ├── report.dart
│       │   ├── select_date_format.dart
│       │   ├── select_icon.dart
│       │   └── select_language.dart
│       ├── auth_pages/
│       │   ├── loading_page.dart
│       │   ├── sign_in.dart
│       │   ├── sign_up.dart
│       │   ├── user_account.dart
│       │   ├── welcome_page.dart
│       │   └── wrapper.dart
│       ├── auth_services/
│       │   └── firebase_authentication.dart
│       ├── classes/
│       │   ├── alert_dialog.dart
│       │   ├── app_bar.dart
│       │   ├── category_item.dart
│       │   ├── chart_pie.dart
│       │   ├── constants.dart
│       │   ├── custom_toast.dart
│       │   ├── dropdown_box.dart
│       │   ├── icons.dart
│       │   ├── input_model.dart
│       │   ├── keyboard.dart
│       │   ├── lockscreen.dart
│       │   └── saveOrSaveAndDeleteButtons.dart
│       ├── database_management/
│       │   ├── database.dart
│       │   ├── shared_preferences_services.dart
│       │   └── sqflite_services.dart
│       ├── draft1.dart
│       ├── home.dart
│       ├── localization/
│       │   ├── app_localization.dart
│       │   ├── lang/
│       │   │   ├── ar.json
│       │   │   ├── de.json
│       │   │   ├── en.json
│       │   │   ├── es.json
│       │   │   ├── fr.json
│       │   │   ├── hi.json
│       │   │   ├── ja.json
│       │   │   ├── ko.json
│       │   │   ├── ne.json
│       │   │   ├── pt.json
│       │   │   ├── ru.json
│       │   │   ├── tr.json
│       │   │   ├── vi.json
│       │   │   └── zh.json
│       │   ├── language.dart
│       │   └── methods.dart
│       ├── provider.dart
│       └── real_main.dart
├── pubspec.yaml
└── test/
    └── widget_test.dart
Download .txt
SYMBOL INDEX (307 symbols across 40 files)

FILE: lib/main.dart
  function main (line 6) | void main()

FILE: lib/project/app_pages/add_category.dart
  class AddCategory (line 17) | class AddCategory extends StatelessWidget {
    method unFocusNode (line 37) | void unFocusNode(BuildContext context)
    method build (line 45) | Widget build(BuildContext context)
  class CategoryName (line 97) | class CategoryName extends StatefulWidget {
    method createState (line 103) | _CategoryNameState createState()
  class _CategoryNameState (line 106) | class _CategoryNameState extends State<CategoryName> {
    method initState (line 112) | void initState()
    method build (line 126) | Widget build(BuildContext context)
    method isIdenticalCategory (line 144) | bool isIdenticalCategory()
  class ParentCategoryCard (line 233) | class ParentCategoryCard extends StatefulWidget {
    method createState (line 237) | _ParentCategoryCardState createState()
  class _ParentCategoryCardState (line 240) | class _ParentCategoryCardState extends State<ParentCategoryCard> {
    method build (line 242) | Widget build(BuildContext context)
  class Description (line 306) | class Description extends StatefulWidget {
    method createState (line 310) | _DescriptionState createState()
  class _DescriptionState (line 313) | class _DescriptionState extends State<Description> {
    method initState (line 318) | void initState()
    method build (line 325) | Widget build(BuildContext context)
  class Save (line 368) | class Save extends StatefulWidget {
    method createState (line 386) | _SaveState createState()
  class _SaveState (line 389) | class _SaveState extends State<Save> {
    method build (line 391) | Widget build(BuildContext context)
    method saveCategoryFunction (line 392) | void saveCategoryFunction()
    method categoryItem (line 404) | CategoryItem categoryItem(IconData iconData)
    method updateCategory (line 411) | void updateCategory()
    method itemsAdd (line 499) | void itemsAdd(List<CategoryItem> items)

FILE: lib/project/app_pages/analysis.dart
  class Analysis (line 31) | class Analysis extends StatefulWidget {
    method createState (line 33) | _AnalysisState createState()
  class _AnalysisState (line 36) | class _AnalysisState extends State<Analysis> {
    method build (line 38) | Widget build(BuildContext context)
    method listViewChild (line 52) | ListView listViewChild(String type)
  class ShowDate (line 70) | class ShowDate extends StatelessWidget {
    method build (line 75) | Widget build(BuildContext context)
  class DateDisplay (line 99) | class DateDisplay extends StatelessWidget {
    method build (line 104) | Widget build(BuildContext context)
  class ShowMoneyFrame (line 141) | class ShowMoneyFrame extends StatelessWidget {
    method build (line 147) | Widget build(BuildContext context)
    method rowFrame (line 148) | Widget rowFrame(String typeName, double value)
  class ShowDetails (line 198) | class ShowDetails extends StatefulWidget {
    method createState (line 203) | _ShowDetailsState createState()
  class _ShowDetailsState (line 206) | class _ShowDetailsState extends State<ShowDetails> {
    method showInExDetails (line 207) | Widget showInExDetails(
    method build (line 279) | Widget build(BuildContext context)
    method recurringFunc (line 403) | void recurringFunc({required int i, n})
  class ShowNullDetail (line 434) | class ShowNullDetail extends StatelessWidget {
    method build (line 441) | Widget build(BuildContext context)
  class CategoryDetails (line 460) | class CategoryDetails extends StatelessWidget {
    method build (line 469) | Widget build(BuildContext context)

FILE: lib/project/app_pages/calendar.dart
  class Calendar (line 24) | class Calendar extends StatelessWidget {
    method build (line 26) | Widget build(BuildContext context)
  class CalendarBody (line 34) | class CalendarBody extends StatefulWidget {
    method createState (line 36) | _CalendarBodyState createState()
  class _CalendarBodyState (line 39) | class _CalendarBodyState extends State<CalendarBody> {
    method initState (line 51) | void initState()
    method dispose (line 57) | void dispose()
    method getHashCode (line 62) | int getHashCode(DateTime key)
    method daysInRange (line 67) | List<DateTime> daysInRange(DateTime first, DateTime last)
    method buildEvents (line 75) | Widget buildEvents(List<InputModel>? transactions)
    method build (line 221) | Widget build(BuildContext context)
    method updateMapValue (line 240) | void updateMapValue<K, V>(Map<K, List<V>> map, K key, V value)
    method transactionsForDay (line 260) | List<InputModel> transactionsForDay(DateTime? day)
    method _getEventsForRange (line 267) | List<InputModel> _getEventsForRange(DateTime start, DateTime end)
    method _onDaySelected (line 275) | void _onDaySelected(DateTime selectedDay, DateTime focusedDay)
    method _onRangeSelected (line 288) | void _onRangeSelected(
  function _buildEventsMarker (line 409) | Widget _buildEventsMarker(DateTime date, List events)
  class Balance (line 431) | class Balance extends StatefulWidget {
    method createState (line 435) | _BalanceState createState()
  class _BalanceState (line 438) | class _BalanceState extends State<Balance> {
    method build (line 440) | Widget build(BuildContext context)
    method summaryFrame (line 452) | Widget summaryFrame(String type, double amount, color)

FILE: lib/project/app_pages/currency.dart
  class Currency (line 10) | class Currency extends StatelessWidget {
    method build (line 12) | Widget build(BuildContext context)

FILE: lib/project/app_pages/edit.dart
  class Edit (line 9) | class Edit extends StatelessWidget {
    method build (line 18) | Widget build(BuildContext context)

FILE: lib/project/app_pages/edit_expense_category.dart
  class EditExpenseCategory (line 12) | class EditExpenseCategory extends StatefulWidget {
    method createState (line 16) | _EditExpenseCategoryState createState()
  class _EditExpenseCategoryState (line 19) | class _EditExpenseCategoryState extends State<EditExpenseCategory> {
    method build (line 21) | Widget build(BuildContext context)

FILE: lib/project/app_pages/edit_income_category.dart
  class EditIncomeCategory (line 14) | class EditIncomeCategory extends StatelessWidget {
    method build (line 18) | Widget build(BuildContext context)

FILE: lib/project/app_pages/expense_category.dart
  class ExpenseCategory (line 14) | class ExpenseCategory extends StatefulWidget {
    method createState (line 16) | _ExpenseCategoryState createState()
  class _ExpenseCategoryState (line 19) | class _ExpenseCategoryState extends State<ExpenseCategory> {
    method build (line 21) | Widget build(BuildContext context)
  class ExpenseCategoryBody (line 35) | class ExpenseCategoryBody extends StatefulWidget {
    method createState (line 41) | _ExpenseCategoryBodyState createState()
  class _ExpenseCategoryBodyState (line 44) | class _ExpenseCategoryBodyState extends State<ExpenseCategoryBody> {
    method build (line 46) | Widget build(BuildContext context)
  class CategoryContainer (line 82) | class CategoryContainer extends StatefulWidget {
    method createState (line 88) | _CategoryContainerState createState()
  class _CategoryContainerState (line 91) | class _CategoryContainerState extends State<CategoryContainer> {
    method build (line 93) | Widget build(BuildContext context)
  class CategoryItems (line 121) | class CategoryItems extends StatefulWidget {
    method createState (line 128) | _CategoryItemsState createState()
  class _CategoryItemsState (line 131) | class _CategoryItemsState extends State<CategoryItems> {
    method build (line 133) | Widget build(BuildContext context)
  class ParentCategory (line 219) | class ParentCategory extends StatefulWidget {
    method createState (line 230) | _ParentCategoryState createState()
  class _ParentCategoryState (line 233) | class _ParentCategoryState extends State<ParentCategory> {
    method build (line 235) | Widget build(BuildContext context)

FILE: lib/project/app_pages/income_category.dart
  class IncomeCategory (line 13) | class IncomeCategory extends StatefulWidget {
    method createState (line 15) | _IncomeCategoryState createState()
  class _IncomeCategoryState (line 18) | class _IncomeCategoryState extends State<IncomeCategory> {
    method build (line 20) | Widget build(BuildContext context)
  class IncomeCategoryBody (line 32) | class IncomeCategoryBody extends StatefulWidget {
    method createState (line 39) | _IncomeCategoryBodyState createState()
  class _IncomeCategoryBodyState (line 42) | class _IncomeCategoryBodyState extends State<IncomeCategoryBody> {
    method build (line 44) | Widget build(BuildContext context)

FILE: lib/project/app_pages/input.dart
  class AddInput (line 38) | class AddInput extends StatefulWidget {
    method createState (line 40) | _AddInputState createState()
  class _AddInputState (line 43) | class _AddInputState extends State<AddInput> {
    method build (line 48) | Widget build(BuildContext context)
  class PanelForKeyboard (line 89) | class PanelForKeyboard extends StatelessWidget {
    method _insertText (line 94) | void _insertText(String myText)
    method _backspace (line 132) | void _backspace()
    method _isUtf16Surrogate (line 185) | bool _isUtf16Surrogate(int value)
    method build (line 190) | Widget build(BuildContext context)
  class AddEditInput (line 217) | class AddEditInput extends StatelessWidget {
    method build (line 229) | Widget build(BuildContext context)
  class AmountCard (line 278) | class AmountCard extends StatefulWidget {
    method createState (line 280) | _AmountCardState createState()
  class _AmountCardState (line 283) | class _AmountCardState extends State<AmountCard> {
    method initState (line 285) | void initState()
    method build (line 299) | Widget build(BuildContext context)
  class CategoryCard (line 372) | class CategoryCard extends StatefulWidget {
    method createState (line 374) | _CategoryCardState createState()
  class _CategoryCardState (line 377) | class _CategoryCardState extends State<CategoryCard> {
    method build (line 379) | Widget build(BuildContext context)
  class DescriptionCard (line 442) | class DescriptionCard extends StatefulWidget {
    method createState (line 444) | _DescriptionCardState createState()
  class _DescriptionCardState (line 447) | class _DescriptionCardState extends State<DescriptionCard> {
    method initState (line 451) | void initState()
    method _buildConfig (line 464) | KeyboardActionsConfig _buildConfig(BuildContext context)
    method build (line 530) | Widget build(BuildContext context)
  class DateCard (line 595) | class DateCard extends StatefulWidget {
    method createState (line 598) | _DateCardState createState()
  class _DateCardState (line 601) | class _DateCardState extends State<DateCard> {
    method build (line 603) | Widget build(BuildContext context)
  function saveInputFunc (line 697) | void saveInputFunc(BuildContext context, bool saveFunction)
  function deleteInputFunction (line 716) | Future<void> deleteInputFunction(
  function onDeletion (line 719) | void onDeletion()

FILE: lib/project/app_pages/others.dart
  class Other (line 24) | class Other extends StatelessWidget {
    method build (line 26) | Widget build(BuildContext context)
  class Settings (line 76) | class Settings extends StatefulWidget {
    method createState (line 81) | State<Settings> createState()
  class _SettingsState (line 84) | class _SettingsState extends State<Settings> {
    method build (line 86) | Widget build(BuildContext context)
    method onReset (line 178) | void onReset()
    method onDeletion (line 195) | Future onDeletion()

FILE: lib/project/app_pages/parent_category.dart
  class ParentCategoryList (line 9) | class ParentCategoryList extends StatelessWidget {
    method build (line 11) | Widget build(BuildContext context)

FILE: lib/project/app_pages/report.dart
  class Report (line 27) | class Report extends StatefulWidget {
    method createState (line 40) | _ReportState createState()
  class _ReportState (line 43) | class _ReportState extends State<Report> {
    method build (line 45) | Widget build(BuildContext context)
  class ReportBody (line 90) | class ReportBody extends StatefulWidget {
    method createState (line 99) | _ReportBodyState createState()
  class _ReportBodyState (line 102) | class _ReportBodyState extends State<ReportBody> {
    method build (line 104) | Widget build(BuildContext context)
    method date (line 119) | DateTime date(int duration)
    method isLeapYear (line 121) | bool isLeapYear(int year)
    method sortByCategory (line 127) | List<InputModel> sortByCategory(
    method monthBasedTransaction (line 167) | MonthAmount monthBasedTransaction(
  function _getGradientAreaSeries (line 561) | List<ChartSeries<MonthAmount, String>> _getGradientAreaSeries(
  class MonthAmount (line 625) | class MonthAmount {

FILE: lib/project/app_pages/select_date_format.dart
  class FormatDate (line 11) | class FormatDate extends StatelessWidget {
    method build (line 15) | Widget build(BuildContext context)

FILE: lib/project/app_pages/select_icon.dart
  class SelectIcon (line 10) | class SelectIcon extends StatelessWidget {
    method build (line 14) | Widget build(BuildContext context)

FILE: lib/project/app_pages/select_language.dart
  class SelectLanguage (line 12) | class SelectLanguage extends StatefulWidget {
    method createState (line 14) | _SelectLanguageState createState()
  class _SelectLanguageState (line 17) | class _SelectLanguageState extends State<SelectLanguage> {
    method build (line 20) | Widget build(BuildContext context)

FILE: lib/project/auth_pages/sign_in.dart
  class SignIn (line 8) | class SignIn extends StatelessWidget {
    method _authenticateUsers (line 9) | Future<String?>? _authenticateUsers(LoginData data)
    method _onRecoverPassword (line 14) | Future<String?>? _onRecoverPassword(String name)
    method build (line 20) | Widget build(BuildContext context)

FILE: lib/project/auth_pages/user_account.dart
  class UserAccount (line 9) | class UserAccount extends StatefulWidget {
    method createState (line 11) | _UserAccountState createState()
  class _UserAccountState (line 14) | class _UserAccountState extends State<UserAccount> {
    method build (line 28) | Widget build(BuildContext context)

FILE: lib/project/auth_services/firebase_authentication.dart
  class FirebaseAuthentication (line 11) | class FirebaseAuthentication {
    method initializeFireBase (line 12) | Future<FirebaseApp> initializeFireBase()
    method googleSignIn (line 17) | Future<User?> googleSignIn({required BuildContext context})
    method signOut (line 44) | Future<void> signOut({required BuildContext context})

FILE: lib/project/classes/alert_dialog.dart
  function iosDialog (line 6) | Future<void> iosDialog(BuildContext context, String content, String action,
  function androidDialog (line 55) | Future<void> androidDialog(BuildContext context, String content, String ...

FILE: lib/project/classes/app_bar.dart
  class BasicAppBar (line 10) | class BasicAppBar extends StatelessWidget with PreferredSizeWidget {
    method build (line 18) | Widget build(BuildContext context)
  class InExAppBar (line 27) | class InExAppBar extends StatelessWidget implements PreferredSizeWidget {
    method build (line 34) | Widget build(BuildContext context)
    method appBarTab (line 35) | Tab appBarTab(String title)
  class CategoryAppBar (line 75) | class CategoryAppBar extends StatelessWidget implements PreferredSizeWid...
    method build (line 83) | Widget build(BuildContext context)
  class EditCategoryAppBar (line 119) | class EditCategoryAppBar extends StatelessWidget implements PreferredSiz...
    method build (line 127) | Widget build(BuildContext context)

FILE: lib/project/classes/category_item.dart
  class CategoryItem (line 1) | class CategoryItem {
    method toJson (line 14) | Map<String, dynamic> toJson()

FILE: lib/project/classes/chart_pie.dart
  class ChartPie (line 9) | class ChartPie extends StatelessWidget {
    method build (line 13) | Widget build(BuildContext context)
  class Annotations (line 63) | class Annotations extends StatelessWidget {
    method build (line 67) | Widget build(BuildContext context)

FILE: lib/project/classes/constants.dart
  function format (line 82) | String format(double number)
  function iconData (line 85) | IconData iconData(CategoryItem item)
  function categoryItem (line 89) | CategoryItem categoryItem(IconData icon, String name)
  function connectionUI (line 92) | Widget? connectionUI(AsyncSnapshot<List<InputModel>> snapshot)
  function createItemList (line 106) | List<CategoryItem> createItemList({
  function inputModel (line 166) | InputModel inputModel(data)
  function filterData (line 175) | List<InputModel> filterData(

FILE: lib/project/classes/custom_toast.dart
  class CustomToast (line 8) | class CustomToast extends StatelessWidget {
    method build (line 12) | Widget build(BuildContext context)
  function customToast (line 37) | void customToast(BuildContext context, String message)

FILE: lib/project/classes/dropdown_box.dart
  class DropDownBox (line 15) | class DropDownBox extends StatelessWidget {
    method build (line 20) | Widget build(BuildContext context)

FILE: lib/project/classes/input_model.dart
  class InputModel (line 3) | class
    method toMap (line 24) | Map<String, dynamic> toMap()
    method fromMap (line 41) | InputModel fromMap(Map<String, dynamic> map)

FILE: lib/project/classes/keyboard.dart
  class CustomKeyboard (line 8) | class CustomKeyboard extends StatelessWidget {
    method generatedKeys (line 22) | List<TextKey> generatedKeys()
    method build (line 50) | Widget build(BuildContext context)
  class TextKey (line 117) | class TextKey extends StatelessWidget {
    method build (line 128) | Widget build(BuildContext context)

FILE: lib/project/classes/lockscreen.dart
  class MainLockScreen (line 18) | class MainLockScreen extends StatelessWidget {
    method build (line 22) | Widget build(BuildContext context)
  class OtherLockScreen (line 61) | class OtherLockScreen extends StatelessWidget {
    method build (line 66) | Widget build(BuildContext context)

FILE: lib/project/classes/saveOrSaveAndDeleteButtons.dart
  class SaveButton (line 16) | class SaveButton extends StatefulWidget {
    method createState (line 23) | _SaveButtonState createState()
  class _SaveButtonState (line 26) | class _SaveButtonState extends State<SaveButton> {
    method build (line 28) | Widget build(BuildContext context)
  class SaveAndDeleteButton (line 61) | class SaveAndDeleteButton extends StatelessWidget {
    method build (line 80) | Widget build(BuildContext context)
  function deleteCategoryFunction (line 129) | Future<void> deleteCategoryFunction(
  function onDeletion (line 137) | void onDeletion()

FILE: lib/project/database_management/shared_preferences_services.dart
  class SharedPrefs (line 27) | class SharedPrefs {
    method setLocale (line 73) | Locale setLocale(String languageCode)
    method getLocale (line 78) | Locale getLocale()
    method getCurrency (line 83) | void getCurrency()
    method getItems (line 95) | List<CategoryItem> getItems(String parentItemName)
    method saveItems (line 103) | void saveItems(String parentItemName, List<CategoryItem> items)
    method getAllExpenseItemsLists (line 110) | List<List<CategoryItem>> getAllExpenseItemsLists()
    method removeItem (line 120) | void removeItem(String itemName)
    method setItems (line 124) | void setItems({required bool setCategoriesToDefault})

FILE: lib/project/database_management/sqflite_services.dart
  class DB (line 8) | abstract class DB {
    method init (line 12) | Future<void> init()
    method onCreate (line 25) | onCreate(Database db, int version)
    method inputModelList (line 34) | Future<List<InputModel>> inputModelList()
    method insert (line 39) | Future<int> insert(InputModel model)
    method update (line 45) | Future<int> update(InputModel model)
    method delete (line 52) | Future<int> delete(int id)
    method deleteAll (line 55) | Future<int> deleteAll ()

FILE: lib/project/home.dart
  class Home (line 16) | class Home extends StatefulWidget {
    method createState (line 18) | _HomeState createState()
  class _HomeState (line 21) | class _HomeState extends State<Home> {
    method bottomNavigationBarItem (line 29) | BottomNavigationBarItem bottomNavigationBarItem(
    method initState (line 42) | void initState()
    method build (line 100) | Widget build(BuildContext context)

FILE: lib/project/localization/app_localization.dart
  class AppLocalization (line 6) | class AppLocalization {
    method of (line 11) | AppLocalization? of(BuildContext context)
    method load (line 15) | Future<void> load()
    method translate (line 23) | String? translate(String key)
    method localizedMap (line 27) | Map<String, String> localizedMap()
  class _DemoLocalizationsDelegate (line 34) | class _DemoLocalizationsDelegate
    method isSupported (line 39) | bool isSupported(Locale locale)
    method load (line 59) | Future<AppLocalization> load(Locale locale)
    method shouldReload (line 66) | bool shouldReload(LocalizationsDelegate<AppLocalization> old)

FILE: lib/project/localization/language.dart
  class Language (line 1) | class Language {

FILE: lib/project/localization/methods.dart
  function locale (line 5) | Locale locale(String languageCode)
  function getTranslated (line 40) | String? getTranslated(BuildContext context, String key)
  function localizedMap (line 44) | Map<String, String>? localizedMap(BuildContext context)

FILE: lib/project/provider.dart
  class ChangeCategoryA (line 9) | class ChangeCategoryA with ChangeNotifier {
    method changeCategory (line 12) | void changeCategory(CategoryItem? newItem)
  class ChangeModelType (line 18) | class ChangeModelType with ChangeNotifier {
    method changeModelType (line 20) | void changeModelType(String newType)
  class ChangeSelectedDate (line 27) | class ChangeSelectedDate with ChangeNotifier {
    method changeSelectedAnalysisDate (line 30) | void changeSelectedAnalysisDate({String? newSelectedDate})
    method changeSelectedReportDate (line 35) | void changeSelectedReportDate({String? newSelectedDate})
  class InputModelList (line 42) | class InputModelList with ChangeNotifier {
    method changeInputModelList (line 44) | void changeInputModelList()
  class ChangeExpenseItem (line 51) | class ChangeExpenseItem with ChangeNotifier {
    method getAllExpenseItems (line 53) | void getAllExpenseItems()
  class ChangeExpenseItemEdit (line 59) | class ChangeExpenseItemEdit with ChangeNotifier {
    method getAllExpenseItems (line 61) | void getAllExpenseItems()
  class ChangeIncomeItem (line 68) | class ChangeIncomeItem with ChangeNotifier {
    method getIncomeItems (line 70) | void getIncomeItems()
  class ChangeIncomeItemEdit (line 76) | class ChangeIncomeItemEdit with ChangeNotifier {
    method getIncomeItems (line 78) | void getIncomeItems()
  class ChangeCategory (line 85) | class ChangeCategory with ChangeNotifier {
    method changeCategoryIcon (line 89) | void changeCategoryIcon(IconData? selectedIcon)
    method changeParentItem (line 94) | void changeParentItem(CategoryItem? newParentItem)
  class OnSwitch (line 101) | class OnSwitch with ChangeNotifier {
    method onSwitch (line 104) | void onSwitch()
  class OnLanguageSelected (line 112) | class OnLanguageSelected with ChangeNotifier {
    method onSelect (line 114) | void onSelect(String newLanguageCode)
  class OnCurrencySelected (line 121) | class OnCurrencySelected with ChangeNotifier {
    method onCurrencySelected (line 123) | void onCurrencySelected(String newCurrency)
  class OnDateFormatSelected (line 132) | class OnDateFormatSelected with ChangeNotifier {
    method onDateFormatSelected (line 134) | void onDateFormatSelected(String newDateFormat)

FILE: lib/project/real_main.dart
  function realMain (line 10) | void realMain()
  class MyApp (line 24) | class MyApp extends StatefulWidget {
    method setLocale (line 25) | void setLocale(BuildContext context, Locale newLocale)
    method createState (line 31) | _MyAppState createState()
  class _MyAppState (line 34) | class _MyAppState extends State<MyApp> {
    method didChangeDependencies (line 43) | void didChangeDependencies()
    method build (line 52) | Widget build(BuildContext context)

FILE: test/widget_test.dart
  function main (line 13) | void main()
Condensed preview — 141 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (461K chars).
[
  {
    "path": ".gitignore",
    "chars": 734,
    "preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\n\n# IntelliJ related\n*.iml\n*.ipr\n*.i"
  },
  {
    "path": ".metadata",
    "chars": 305,
    "preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
  },
  {
    "path": "LICENSE",
    "chars": 1067,
    "preview": "MIT License\n\nCopyright (c) 2021 Hoa Nguyen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy"
  },
  {
    "path": "README.md",
    "chars": 2087,
    "preview": "# MMAS: Money Tracker\n\n> An optimized application for daily expense tracking and finance management. <br />\n\n![MMAS (820"
  },
  {
    "path": "android/.gitignore",
    "chars": 286,
    "preview": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remembe"
  },
  {
    "path": "android/app/build.gradle",
    "chars": 2113,
    "preview": "def localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertie"
  },
  {
    "path": "android/app/src/debug/AndroidManifest.xml",
    "chars": 337,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.mmas.money_assistant_2608\">\n    <!"
  },
  {
    "path": "android/app/src/main/AndroidManifest.xml",
    "chars": 2149,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.mmas.money_assistant_2608\">\n   <ap"
  },
  {
    "path": "android/app/src/main/kotlin/com/mmas/money_assistant_2608/MainActivity.kt",
    "chars": 134,
    "preview": "package com.mmas.money_assistant_2608\n\nimport io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity: FlutterA"
  },
  {
    "path": "android/app/src/main/res/drawable/launch_background.xml",
    "chars": 320,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item"
  },
  {
    "path": "android/app/src/main/res/drawable-v21/launch_background.xml",
    "chars": 320,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item"
  },
  {
    "path": "android/app/src/main/res/values/styles.xml",
    "chars": 1052,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is sta"
  },
  {
    "path": "android/app/src/main/res/values-night/styles.xml",
    "chars": 1051,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <!-- Theme applied to the Android Window while the process is sta"
  },
  {
    "path": "android/app/src/profile/AndroidManifest.xml",
    "chars": 337,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.mmas.money_assistant_2608\">\n    <!"
  },
  {
    "path": "android/build.gradle",
    "chars": 565,
    "preview": "buildscript {\n    ext.kotlin_version = '1.8.0'\n    repositories {\n        google()\n        jcenter()\n    }\n\n    dependen"
  },
  {
    "path": "android/gradle/wrapper/gradle-wrapper.properties",
    "chars": 233,
    "preview": "#Fri Jun 23 08:50:38 CEST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER"
  },
  {
    "path": "android/gradle.properties",
    "chars": 193,
    "preview": "#org.gradle.jvmargs=-Xmx1536M\nandroid.useAndroidX=true\nandroid.enableJetifier=true\norg.gradle.java.home=C:/Program Files"
  },
  {
    "path": "android/settings.gradle",
    "chars": 462,
    "preview": "include ':app'\n\ndef localPropertiesFile = new File(rootProject.projectDir, \"local.properties\")\ndef properties = new Prop"
  },
  {
    "path": "flutter",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "ios/.gitignore",
    "chars": 561,
    "preview": "*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/DerivedDat"
  },
  {
    "path": "ios/Flutter/AppFrameworkInfo.plist",
    "chars": 773,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Flutter/Debug.xcconfig",
    "chars": 107,
    "preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Flutter/Release.xcconfig",
    "chars": 109,
    "preview": "#include? \"Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig\"\n#include \"Generated.xcconfig\"\n"
  },
  {
    "path": "ios/Podfile",
    "chars": 1352,
    "preview": "# Uncomment this line to define a global platform for your project\nplatform :ios, '9.0'\n\n# CocoaPods analytics sends net"
  },
  {
    "path": "ios/Runner/AppDelegate.swift",
    "chars": 404,
    "preview": "import UIKit\nimport Flutter\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n  override func applicatio"
  },
  {
    "path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 3396,
    "preview": "{\"images\":[{\"size\":\"60x60\",\"expected-size\":\"180\",\"filename\":\"180.png\",\"folder\":\"Assets.xcassets/AppIcon.appiconset/\",\"id"
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json",
    "chars": 308,
    "preview": "{\n  \"images\" : [\n    {\n      \"filename\" : \"background.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n   "
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
    "chars": 391,
    "preview": "{\n  \"images\" : [\n    {\n      \"filename\" : \"LaunchImage.png\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n  "
  },
  {
    "path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
    "chars": 336,
    "preview": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in"
  },
  {
    "path": "ios/Runner/Base.lproj/LaunchScreen.storyboard",
    "chars": 3486,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
  },
  {
    "path": "ios/Runner/Base.lproj/Main.storyboard",
    "chars": 1605,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
  },
  {
    "path": "ios/Runner/GoogleService-Info.plist",
    "chars": 1123,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Runner/Info.plist",
    "chars": 2361,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Runner/Runner-Bridging-Header.h",
    "chars": 38,
    "preview": "#import \"GeneratedPluginRegistrant.h\"\n"
  },
  {
    "path": "ios/Runner/Runner.entitlements",
    "chars": 246,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Runner.xcodeproj/project.pbxproj",
    "chars": 23365,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 51;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 135,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "chars": 226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
    "chars": 3291,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "ios/Runner.xcworkspace/contents.xcworkspacedata",
    "chars": 224,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Runner.xcodepr"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "chars": 226,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "lib/main.dart",
    "chars": 114,
    "preview": "// @dart=2.9\n\n\nimport 'package:money_assistant_2608/project/real_main.dart';\n\nvoid main() async {\n  realMain();\n}\n"
  },
  {
    "path": "lib/project/app_pages/add_category.dart",
    "chars": 21116,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flut"
  },
  {
    "path": "lib/project/app_pages/analysis.dart",
    "chars": 18221,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flut"
  },
  {
    "path": "lib/project/app_pages/calendar.dart",
    "chars": 19396,
    "preview": "import 'dart:collection';\n\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'pack"
  },
  {
    "path": "lib/project/app_pages/currency.dart",
    "chars": 4021,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:mon"
  },
  {
    "path": "lib/project/app_pages/edit.dart",
    "chars": 1207,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:money_assistant_2608/pr"
  },
  {
    "path": "lib/project/app_pages/edit_expense_category.dart",
    "chars": 1537,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:money_assistant_2608/pr"
  },
  {
    "path": "lib/project/app_pages/edit_income_category.dart",
    "chars": 1240,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:money_assistant_2608'\n "
  },
  {
    "path": "lib/project/app_pages/expense_category.dart",
    "chars": 11648,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flut"
  },
  {
    "path": "lib/project/app_pages/income_category.dart",
    "chars": 5009,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flut"
  },
  {
    "path": "lib/project/app_pages/input.dart",
    "chars": 24581,
    "preview": "import 'dart:core';\nimport 'dart:io' show Platform;\nimport 'package:day_night_time_picker/day_night_time_picker.dart';\ni"
  },
  {
    "path": "lib/project/app_pages/others.dart",
    "chars": 11396,
    "preview": "import 'dart:core';\n\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:fl"
  },
  {
    "path": "lib/project/app_pages/parent_category.dart",
    "chars": 2755,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:mon"
  },
  {
    "path": "lib/project/app_pages/report.dart",
    "chars": 33477,
    "preview": "/// Package import\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\n"
  },
  {
    "path": "lib/project/app_pages/select_date_format.dart",
    "chars": 3278,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:intl/intl.dart';\nimport"
  },
  {
    "path": "lib/project/app_pages/select_icon.dart",
    "chars": 1883,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flut"
  },
  {
    "path": "lib/project/app_pages/select_language.dart",
    "chars": 3721,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flutter_screenutil.dart';\nimport 'package:mon"
  },
  {
    "path": "lib/project/auth_pages/loading_page.dart",
    "chars": 433,
    "preview": "// import 'package:flutter/material.dart';\n// import 'package:flutter_spinkit/flutter_spinkit.dart';\n//\n// class Loading"
  },
  {
    "path": "lib/project/auth_pages/sign_in.dart",
    "chars": 9481,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_login/flutter_l"
  },
  {
    "path": "lib/project/auth_pages/sign_up.dart",
    "chars": 3849,
    "preview": "// import 'package:flutter/cupertino.dart';\n// import 'package:flutter/material.dart';\n//\n// import '../../classes/texti"
  },
  {
    "path": "lib/project/auth_pages/user_account.dart",
    "chars": 6430,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flut"
  },
  {
    "path": "lib/project/auth_pages/welcome_page.dart",
    "chars": 1848,
    "preview": "// import 'package:flutter/cupertino.dart';\n// import 'package:flutter/material.dart';\n//\n// import 'sign_in.dart';\n// i"
  },
  {
    "path": "lib/project/auth_pages/wrapper.dart",
    "chars": 435,
    "preview": "// import 'package:flutter/cupertino.dart';\n//\n// import '../app_pages/home.dart';\n// import 'welcome_page.dart';\n//\n// "
  },
  {
    "path": "lib/project/auth_services/firebase_authentication.dart",
    "chars": 3604,
    "preview": "import 'dart:async';\n\nimport 'package:firebase_auth/firebase_auth.dart';\nimport 'package:firebase_core/firebase_core.dar"
  },
  {
    "path": "lib/project/classes/alert_dialog.dart",
    "chars": 2953,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flut"
  },
  {
    "path": "lib/project/classes/app_bar.dart",
    "chars": 4003,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:money_assistant_2608/pr"
  },
  {
    "path": "lib/project/classes/category_item.dart",
    "chars": 715,
    "preview": "class CategoryItem {\n  int iconCodePoint;\n  String? iconFontPackage;\n  String? iconFontFamily;\n  String text;\n  String? "
  },
  {
    "path": "lib/project/classes/chart_pie.dart",
    "chars": 2917,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flut"
  },
  {
    "path": "lib/project/classes/constants.dart",
    "chars": 12810,
    "preview": "import 'package:flutter/material.dart';\nimport 'package:intl/intl.dart';\nimport 'package:money_assistant_2608/project/da"
  },
  {
    "path": "lib/project/classes/custom_toast.dart",
    "chars": 1334,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:fluttertoast/fluttertoa"
  },
  {
    "path": "lib/project/classes/dropdown_box.dart",
    "chars": 2341,
    "preview": "import 'dart:ui';\nimport 'package:provider/provider.dart';\n\nimport 'package:flutter/cupertino.dart';\nimport 'package:flu"
  },
  {
    "path": "lib/project/classes/icons.dart",
    "chars": 3055,
    "preview": "// //for select_icon\n// import 'package:eva_icons_flutter/eva_icons_flutter.dart';\n// import 'package:flutter/material.d"
  },
  {
    "path": "lib/project/classes/input_model.dart",
    "chars": 976,
    "preview": "import 'dart:ui';\n\nclass\nInputModel {\n  int? id;\n  String? type;\n  double? amount;\n  String? category;\n  String? descrip"
  },
  {
    "path": "lib/project/classes/keyboard.dart",
    "chars": 4606,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_screenutil/flut"
  },
  {
    "path": "lib/project/classes/lockscreen.dart",
    "chars": 5219,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_app_lock/flutte"
  },
  {
    "path": "lib/project/classes/saveOrSaveAndDeleteButtons.dart",
    "chars": 5933,
    "preview": "import 'dart:io' show Platform;\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport "
  },
  {
    "path": "lib/project/database_management/database.dart",
    "chars": 1907,
    "preview": "// import 'package:cloud_firestore/cloud_firestore.dart';\n// import 'package:firebase_auth/firebase_auth.dart';\n//\n// cl"
  },
  {
    "path": "lib/project/database_management/shared_preferences_services.dart",
    "chars": 8876,
    "preview": "import 'dart:convert';\nimport 'dart:io';\nimport 'dart:ui';\n\nimport 'package:flutter/cupertino.dart';\nimport 'package:flu"
  },
  {
    "path": "lib/project/database_management/sqflite_services.dart",
    "chars": 1656,
    "preview": "import 'dart:async';\n\nimport 'package:path/path.dart' as p;\nimport 'package:sqflite/sqflite.dart';\n\nimport '../classes/i"
  },
  {
    "path": "lib/project/draft1.dart",
    "chars": 17990,
    "preview": "// import 'dart:collection';\n//\n// import 'package:flutter/cupertino.dart';\n// import 'package:flutter/material.dart';\n/"
  },
  {
    "path": "lib/project/home.dart",
    "chars": 4933,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/painting.dart';"
  },
  {
    "path": "lib/project/localization/app_localization.dart",
    "chars": 1663,
    "preview": "import 'dart:convert';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nclass AppLocali"
  },
  {
    "path": "lib/project/localization/lang/ar.json",
    "chars": 3196,
    "preview": "{\n  \"Input\": \"\",\n  \"Analysis\": \"\",\n  \"Calendar\": \"\",\n  \"Other\": \"\",\n  \"OtherIncome\": \"\",\n  \"OtherExpense\": \"\",\n  \"INCOME"
  },
  {
    "path": "lib/project/localization/lang/de.json",
    "chars": 5309,
    "preview": "{\n  \"Input\": \"Eingang\",\n  \"Analysis\": \"Analyse\",\n  \"Calendar\": \"Kalender\",\n  \"Other\": \"Andere\",\n  \"OtherIncome\": \"Andere"
  },
  {
    "path": "lib/project/localization/lang/en.json",
    "chars": 4911,
    "preview": "{\n  \"Input\": \"Add\",\n  \"Analysis\": \"Analysis\",\n  \"Calendar\": \"Calendar\",\n  \"Other\": \"Other\",\n  \"OtherIncome\": \"Other\",\n  "
  },
  {
    "path": "lib/project/localization/lang/es.json",
    "chars": 5318,
    "preview": "{\n  \"Input\": \"Aporte\",\n  \"Analysis\": \"Análisis\",\n  \"Calendar\": \"Calendario\",\n  \"Other\": \"Otro\",\n  \"OtherIncome\": \"Otro\","
  },
  {
    "path": "lib/project/localization/lang/fr.json",
    "chars": 5413,
    "preview": "{\n  \"Input\": \"Intrant\",\n  \"Analysis\": \"Analyse\",\n  \"Calendar\": \"Calendrier\",\n  \"Other\": \"Autre\",\n  \"OtherIncome\": \"Autre"
  },
  {
    "path": "lib/project/localization/lang/hi.json",
    "chars": 4820,
    "preview": "{\n  \"Input\": \"इनपुट\",\n  \"Analysis\": \"विश्लेषण\",\n  \"Calendar\": \"कैलेंडर\",\n  \"Other\": \"अन्य\",\n  \"OtherIncome\": \"अन्य\",\n  \""
  },
  {
    "path": "lib/project/localization/lang/ja.json",
    "chars": 4033,
    "preview": "{\n  \"Input\": \"入力\",\n  \"Analysis\": \"分析\",\n  \"Calendar\": \"カレンダー\",\n  \"Other\": \"その他\",\n  \"OtherIncome\": \"その他\",\n  \"OtherExpense\""
  },
  {
    "path": "lib/project/localization/lang/ko.json",
    "chars": 3944,
    "preview": "{\n  \"Input\": \"입력\",\n  \"Analysis\": \"분석\",\n  \"Calendar\": \"달력\",\n  \"Other\": \"다른\",\n  \"OtherIncome\": \"다른\",\n  \"OtherExpense\": \"다른"
  },
  {
    "path": "lib/project/localization/lang/ne.json",
    "chars": 4959,
    "preview": "{\n  \"Input\": \"थप्नुहोस्\",\n  \"Analysis\": \"विश्लेषण\",\n  \"Calendar\": \"पात्रो\",\n  \"Other\": \"अन्य\",\n  \"OtherIncome\": \"अन्य\",\n"
  },
  {
    "path": "lib/project/localization/lang/pt.json",
    "chars": 5271,
    "preview": "{\n  \"Input\": \"Entrada\",\n  \"Analysis\": \"Análise\",\n  \"Calendar\": \"Calendário\",\n  \"Other\": \"Outro\",\n  \"OtherIncome\": \"Outro"
  },
  {
    "path": "lib/project/localization/lang/ru.json",
    "chars": 5049,
    "preview": "{\n  \"Input\": \"Вход\",\n  \"Analysis\": \"Анализ\",\n  \"Calendar\": \"Календарь\",\n  \"Other\": \"Другой\",\n  \"OtherIncome\": \"Другой\",\n"
  },
  {
    "path": "lib/project/localization/lang/tr.json",
    "chars": 4932,
    "preview": "{\n  \"Input\": \"Giriş\",\n  \"Analysis\": \"Analiz\",\n  \"Calendar\": \"Takvim\",\n  \"Other\": \"Diğer\",\n  \"OtherIncome\": \"Diğer\",\n  \"O"
  },
  {
    "path": "lib/project/localization/lang/vi.json",
    "chars": 4951,
    "preview": "{\n  \"Input\": \"Nhập liệu \",\n  \"Analysis\": \"Phân tích\",\n  \"Calendar\": \"Lịch \",\n  \"Other\": \"Khác\",\n  \"OtherIncome\": \"Khác\","
  },
  {
    "path": "lib/project/localization/lang/zh.json",
    "chars": 3694,
    "preview": "{\n  \"Input\": \"输入\",\n  \"Analysis\": \"报告\",\n  \"Calendar\": \"日历 \",\n  \"Other\": \"其他\",\n  \"OtherIncome\": \"其他\",\n  \"OtherExpense\": \"其"
  },
  {
    "path": "lib/project/localization/language.dart",
    "chars": 1499,
    "preview": "class Language {\n  final int id;\n  final String flag;\n  final String name;\n  final String languageCode;\n  final String c"
  },
  {
    "path": "lib/project/localization/methods.dart",
    "chars": 1091,
    "preview": "import 'package:flutter/material.dart';\n\nimport 'app_localization.dart';\n\nLocale locale(String languageCode) {\n  switch "
  },
  {
    "path": "lib/project/provider.dart",
    "chars": 3648,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:money_assistant_2608/project/classes/category_item.dart';\nimpor"
  },
  {
    "path": "lib/project/real_main.dart",
    "chars": 3975,
    "preview": "import 'package:flutter/cupertino.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_localizations/f"
  },
  {
    "path": "pubspec.yaml",
    "chars": 8171,
    "preview": "name: money_assistant_2608\ndescription: A new Flutter project.\n\n# The following line prevents the package from being acc"
  },
  {
    "path": "test/widget_test.dart",
    "chars": 1060,
    "preview": "// This is a basic Flutter widget test.\n//\n// To perform an interaction with a widget in your test, use the WidgetTester"
  }
]

// ... and 36 more files (download for full content)

About this extraction

This page contains the full source code of the floranguyen0/mmas-money-tracker GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 141 files (408.3 KB), approximately 99.9k tokens, and a symbol index with 307 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!