Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

7 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Clean Notes

A simple, fast notes app for Android. Syncs to the cloud. Subscribes through your mobile carrier billing.

Latest Release (v1.0.0)


Download Clean Notes from AppsPro


Flutter Android Material 3 Firebase BDApps


Table of Contents

  1. What is Clean Notes
  2. Features
  3. Tech Stack
  4. Platform
  5. Subscription & Billing
  6. Project Layout
  7. Quick Start
  8. Architecture
  9. Documentation

What is Clean Notes

Clean Notes is a paid notes app for Android, built with Flutter.



You write a note, save it, and it is waiting for you the next time you open the app. Notes are stored in the cloud, so they survive a reinstall, a phone change, or a factory reset.

The app is gated by an AppsPro / BDApps subscription at BDT 2/= per day, billed to your mobile phone bill by your operator.


Features

Feature Description
✏️ Create Add a note with a title and description.
πŸ‘οΈ View Every note is shown in a live-updating list, most-recently-edited first.
πŸ”§ Update Tap any note to change its title or description. The updatedAt timestamp refreshes automatically.
πŸ—‘οΈ Delete Remove a note with a confirmation dialog.
πŸ” Per-user isolation Each subscriber's notes are stored under their own user space in Cloud Firestore. Two accounts on the same device cannot see each other's notes.
☁️ Cloud sync Notes are backed up to Firebase. New notes save locally first and sync when you are online again.
πŸ“΄ Offline reading Notes you have already opened are available without internet.
πŸ‡§πŸ‡© Carrier billing BDT 2/= per day, added to your mobile bill by your operator through AppsPro / BDApps. No card or bank account needed.
πŸšͺ Self-service unsubscribe Logout and cancel your subscription from inside the app.

Tech Stack

Layer Technology
Framework Flutter 3.x
Language Dart 3.12+
UI Material 3
Backend Firebase (firebase_core 4.x, cloud_firestore 6.x, firebase_auth 6.5.4 β€” anonymous)
Subscription billing AppsPro / BDApps REST SDK β€” https://api.appspro.dev/api/v1
Networking package:http (direct HTTPS)
Local storage SharedPreferences (subscriber record only)
Build Gradle (Kotlin DSL), Android Gradle Plugin, JDK 17
Signing Release keystore (not included in source)

Platform

Property Value
Operating system Android
Minimum version Android 5.0 (Lollipop, API 21)
Target version Android 14 (API 34)
Architectures arm64-v8a, armeabi-v7a, x86_64
iOS, web, desktop Not built or supported in this release

Subscription & Billing

Clean Notes is provided as a paid service through the Bangladeshi carrier billing platform (AppsPro / BDApps).

Price BDT 2/= per day (about BDT 60/= per 30-day month)
How you pay Added to your mobile phone bill by your operator
How to subscribe Open the app, enter your Bangladeshi mobile number, verify the OTP
How to unsubscribe Tap Logout / Unsubscribe at the bottom of the notes list
Listing appspro.dev/app/CkFUYUsruI

It may take up to 24 hours for an unsubscribe to fully reflect on your operator bill. If the BDT 2/= daily charge still appears after 24 hours, contact your mobile operator.


Project Layout

lib/
β”œβ”€β”€ main.dart                            # App entry, Firebase bootstrap, auth try/catch
β”œβ”€β”€ firebase_options.dart                # Generated by `flutterfire configure`
β”œβ”€β”€ config/
β”‚   └── appspro_config.dart              # AppsPro base URL + secret key
β”œβ”€β”€ models/
β”‚   β”œβ”€β”€ note.dart                        # Note entity + Firestore (de)serialisation
β”‚   └── subscriber.dart                  # Subscriber record (phone, subscriber_id)
β”œβ”€β”€ services/
β”‚   β”œβ”€β”€ notes_service.dart               # Firestore CRUD wrapper, per-user scoped
β”‚   └── subscription_service.dart        # AppsPro / BDApps REST wrapper
β”œβ”€β”€ screens/
β”‚   β”œβ”€β”€ login_screen.dart                # Phone entry + OTP request
β”‚   β”œβ”€β”€ subscription_gate.dart           # Subscription wall + state machine
β”‚   β”œβ”€β”€ subscription_success_screen.dart # Post-verify confirmation
β”‚   β”œβ”€β”€ notes_list_screen.dart           # Home screen β€” live list + add FAB
β”‚   └── note_editor_screen.dart          # Add / edit form
└── widgets/
    └── note_tile.dart                   # Single-row presentation

Quick Start

See FIREBASE_SETUP.md for the full Firebase / Firestore setup walkthrough. See APPSPRO_INTEGRATION.md for the AppsPro / BDApps credential setup and the subscribe / unsubscribe flow.

TL;DR:

flutter pub get
flutterfire configure --project=<your-project-id>
flutter run

Build a release APK:

flutter build apk --release

The signed APK lands at build\app\outputs\flutter-apk\app-release.apk.


Architecture

graph TD
    subgraph UI_Layer [UI Layer]
        Main[main.dart] --> Login[LoginScreen]
        Main --> Gate[SubscriptionGate]
        Gate --> List[NotesListScreen]
        List --> Editor[NoteEditorScreen]
    end

    subgraph Service_Layer [Service Layer]
        AuthSvc[AuthService]
        NotesSvc[NotesService]
        SubSvc[SubscriptionService]
    end

    subgraph External_Layer [External Services & DB]
        FA[Firebase Auth]
        CF[Cloud Firestore]
        SP[(SharedPreferences)]
        AP[AppsPro / BDApps REST API]
    end

    %% UI to Service Connections
    Login --> AuthSvc
    Gate --> SubSvc
    List --> NotesSvc
    List --> SubSvc
    Editor --> NotesSvc

    %% Service to External Connections
    AuthSvc --> FA
    NotesSvc --> CF
    SubSvc --> AP
    SubSvc --> SP
Loading
  • Single source of truth β€” the UI subscribes to a Firestore stream; there is no local cache for notes. This keeps the code short and matches the assignment scope.
  • NotesService isolates Firestore APIs β€” the screens never touch FirebaseFirestore directly. Swap it for a mock or REST client in tests.
  • SubscriptionService isolates AppsPro APIs β€” the screens never touch the BDApps HTTP endpoints directly. Errors throw SubscriptionException; the UI catches them and shows a snackbar.
  • Per-user data isolation β€” every Firestore query is scoped by the current firebase_auth user UID. Two subscribers on the same device see two independent notes lists.
  • No business logic in widgets β€” validation lives in the form, persistence lives in the service, presentation lives in the tile.
  • Material 3 themed with a single seeded ColorScheme.
  • Anonymous Firebase Authentication is used at boot to give the app a stable per-device identity for Firestore rules, with a defensive try/catch around the bootstrap so a misconfigured Firebase project does not blank-crash the app on startup.

Documentation

File Purpose
USER_MANUAL.txt End-user guide: install, subscribe, use, unsubscribe.
RELEASE_NOTES.md Release notes (v1.0.0) and user-facing app description.
FIREBASE_SETUP.md Firebase project setup and Firestore rules.
APPSPRO_INTEGRATION.md AppsPro / BDApps setup, endpoints, secret-key handling.

Author & Credits

Developed by: Abir Hasan Arko

Powered by: BDApps & AppsPro


About

πŸ“ A simple, fast Material 3 notes app for Android built with Flutter and Firebase. Features secure cloud sync and carrier billing integration via AppsPro / BDApps.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages