Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions PLAY_STORE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Mizafi — Play Store release

This branch prepares **Mizafi** for Google Play publishing. The open-source repository remains **[FlowFi](https://github.com/saadkhalidkhan/FlowFi)**; only the shipped app identity changes.

| Item | Value |
|------|--------|
| **Play Store app name** | Mizafi |
| **Package name** | `com.saadproductlabs.mizafi` |
| **Developer / publisher** | Saad Product Labs |

## Build a release APK or AAB

```bash
./gradlew :app:bundleRelease
```

Output: `app/build/outputs/bundle/release/app-release.aab`

For a local APK:

```bash
./gradlew :app:assembleRelease
```

## Install debug build

```bash
./gradlew :app:installDebug
adb shell am start -n com.saadproductlabs.mizafi/.MainActivity
```

## Before you upload

1. **Signing** — Configure a release keystore in `app/build.gradle.kts` (not committed).
2. **Store listing** — App name **Mizafi**, developer **Saad Product Labs**.
3. **Privacy policy** — Required if you collect data; this app stores data locally only (Room).
4. **Screenshots** — Capture from this branch (Mizafi branding).
5. **Version** — Bump `versionCode` / `versionName` in `app/build.gradle.kts` for each release.

## Copyright

Source is licensed under the [MIT License](LICENSE):

> Copyright (c) 2026 Saad Khalid Khan

Publishing on Play Store under **Saad Product Labs** does not change the license or GitHub repo name.
22 changes: 12 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# FlowFi

> **Play Store branch:** App ships as **[Mizafi](PLAY_STORE.md)** (`com.saadproductlabs.mizafi`) by **Saad Product Labs**. This GitHub repo name stays **FlowFi**.

[![CI](https://github.com/saadkhalidkhan/FlowFi/actions/workflows/ci.yml/badge.svg)](https://github.com/saadkhalidkhan/FlowFi/actions/workflows/ci.yml)
[![Docs](https://github.com/saadkhalidkhan/FlowFi/actions/workflows/docs.yml/badge.svg)](https://github.com/saadkhalidkhan/FlowFi/actions/workflows/docs.yml)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
Expand Down Expand Up @@ -73,18 +75,18 @@ Install on a device or emulator:

```bash
./gradlew :app:installDebug
adb shell am start -n com.example.flowfi/.MainActivity
adb shell am start -n com.saadproductlabs.mizafi/.MainActivity
```

## Usage examples

### Insert a transaction

```kotlin
import com.example.flowfi.data.database.AppDatabase
import com.example.flowfi.data.entity.TransactionEntity
import com.example.flowfi.data.entity.TransactionType
import com.example.flowfi.data.repository.TransactionRepositoryImpl
import com.saadproductlabs.mizafi.data.database.AppDatabase
import com.saadproductlabs.mizafi.data.entity.TransactionEntity
import com.saadproductlabs.mizafi.data.entity.TransactionType
import com.saadproductlabs.mizafi.data.repository.TransactionRepositoryImpl

val repository = TransactionRepositoryImpl(
AppDatabase.getDatabase(context).transactionDao()
Expand All @@ -104,7 +106,7 @@ repository.insertTransaction(
### Observe totals in a ViewModel

```kotlin
import com.example.flowfi.data.entity.TransactionType
import com.saadproductlabs.mizafi.data.entity.TransactionType
import kotlinx.coroutines.flow.map

repository.getAllTransactions()
Expand All @@ -118,7 +120,7 @@ repository.getAllTransactions()
### Create a savings goal

```kotlin
import com.example.flowfi.data.entity.SavingsGoalEntity
import com.saadproductlabs.mizafi.data.entity.SavingsGoalEntity

savingsGoalRepository.insertGoal(
SavingsGoalEntity(
Expand All @@ -132,7 +134,7 @@ savingsGoalRepository.insertGoal(
### Generate behavioral insights

```kotlin
import com.example.flowfi.domain.InsightEngine
import com.saadproductlabs.mizafi.domain.InsightEngine

val insights = InsightEngine.generate(transactions)
insights.forEach { println(it.message) }
Expand All @@ -141,7 +143,7 @@ insights.forEach { println(it.message) }
### Wire repositories in `Application`

```kotlin
class FlowFiApplication : Application() {
class MizafiApplication : Application() {
val database by lazy { AppDatabase.getDatabase(this) }
val repository by lazy { TransactionRepositoryImpl(database.transactionDao()) }
val savingsGoalRepository by lazy {
Expand Down Expand Up @@ -170,7 +172,7 @@ Published docs (GitHub Pages): **https://saadkhalidkhan.github.io/FlowFi/**
```
FlowFi/
├── app/
│ └── src/main/java/com/example/flowfi/
└── src/main/java/com/saadproductlabs/mizafi/
│ ├── data/ # Room entities, DAOs, repositories
│ ├── domain/ # InsightEngine, CategoryAnalytics
│ ├── ui/ # Compose screens, theme, navigation
Expand Down
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ plugins {
}

android {
namespace = "com.example.flowfi"
namespace = "com.saadproductlabs.mizafi"
compileSdk = 36

defaultConfig {
applicationId = "com.example.flowfi"
applicationId = "com.saadproductlabs.mizafi"
minSdk = 26
targetSdk = 36
versionCode = 1
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.flowfi
package com.saadproductlabs.mizafi

import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
Expand All @@ -19,6 +19,6 @@ class ExampleInstrumentedTest {
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.example.flowfi", appContext.packageName)
assertEquals("com.saadproductlabs.mizafi", appContext.packageName)
}
}
6 changes: 3 additions & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,20 @@
<uses-permission android:name="android.permission.INTERNET" />

<application
android:name=".FlowFiApplication"
android:name=".MizafiApplication"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.FlowFi">
android:theme="@style/Theme.Mizafi">
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.FlowFi">
android:theme="@style/Theme.Mizafi">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand Down
16 changes: 0 additions & 16 deletions app/src/main/java/com/example/flowfi/FlowFiApplication.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.flowfi
package com.saadproductlabs.mizafi

import android.os.Bundle
import androidx.activity.ComponentActivity
Expand All @@ -11,10 +11,10 @@ import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.lifecycle.viewmodel.compose.viewModel
import com.example.flowfi.ui.navigation.FlowFiNavHost
import com.example.flowfi.ui.theme.FlowFiTheme
import com.example.flowfi.viewmodel.TransactionViewModel
import com.example.flowfi.viewmodel.TransactionViewModelFactory
import com.saadproductlabs.mizafi.ui.navigation.MizafiNavHost
import com.saadproductlabs.mizafi.ui.theme.MizafiTheme
import com.saadproductlabs.mizafi.viewmodel.TransactionViewModel
import com.saadproductlabs.mizafi.viewmodel.TransactionViewModelFactory

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -30,8 +30,8 @@ class MainActivity : ComponentActivity() {
)
)
setContent {
FlowFiTheme {
val application = application as FlowFiApplication
MizafiTheme {
val application = application as MizafiApplication
val viewModel: TransactionViewModel = viewModel(
factory = TransactionViewModelFactory(
application.repository,
Expand All @@ -43,7 +43,7 @@ class MainActivity : ComponentActivity() {
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
FlowFiNavHost(viewModel = viewModel)
MizafiNavHost(viewModel = viewModel)
}
}
}
Expand Down
16 changes: 16 additions & 0 deletions app/src/main/java/com/saadproductlabs/mizafi/MizafiApplication.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.saadproductlabs.mizafi

import android.app.Application
import com.saadproductlabs.mizafi.data.database.AppDatabase
import com.saadproductlabs.mizafi.data.repository.SavingsGoalRepository
import com.saadproductlabs.mizafi.data.repository.SavingsGoalRepositoryImpl
import com.saadproductlabs.mizafi.data.repository.TransactionRepository
import com.saadproductlabs.mizafi.data.repository.TransactionRepositoryImpl

class MizafiApplication : Application() {
val database: AppDatabase by lazy { AppDatabase.getDatabase(this) }
val repository: TransactionRepository by lazy { TransactionRepositoryImpl(database.transactionDao()) }
val savingsGoalRepository: SavingsGoalRepository by lazy {
SavingsGoalRepositoryImpl(database.savingsGoalDao())
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.example.flowfi.data.dao
package com.saadproductlabs.mizafi.data.dao

import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Update
import com.example.flowfi.data.entity.SavingsGoalEntity
import com.saadproductlabs.mizafi.data.entity.SavingsGoalEntity
import kotlinx.coroutines.flow.Flow

@Dao
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.example.flowfi.data.dao
package com.saadproductlabs.mizafi.data.dao

import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Update
import com.example.flowfi.data.entity.TransactionEntity
import com.saadproductlabs.mizafi.data.entity.TransactionEntity
import kotlinx.coroutines.flow.Flow

@Dao
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package com.example.flowfi.data.database
package com.saadproductlabs.mizafi.data.database

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import com.example.flowfi.data.dao.SavingsGoalDao
import com.example.flowfi.data.dao.TransactionDao
import com.example.flowfi.data.entity.SavingsGoalEntity
import com.example.flowfi.data.entity.TransactionEntity
import com.saadproductlabs.mizafi.data.dao.SavingsGoalDao
import com.saadproductlabs.mizafi.data.dao.TransactionDao
import com.saadproductlabs.mizafi.data.entity.SavingsGoalEntity
import com.saadproductlabs.mizafi.data.entity.TransactionEntity

@Database(
entities = [TransactionEntity::class, SavingsGoalEntity::class],
Expand All @@ -29,7 +29,7 @@ abstract class AppDatabase : RoomDatabase() {
val instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"flowfi_database"
"mizafi_database"
).fallbackToDestructiveMigration()
.build()
INSTANCE = instance
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.example.flowfi.data.database
package com.saadproductlabs.mizafi.data.database

import androidx.room.TypeConverter
import com.example.flowfi.data.entity.TransactionType
import com.saadproductlabs.mizafi.data.entity.TransactionType

class Converters {
@TypeConverter
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.flowfi.data.entity
package com.saadproductlabs.mizafi.data.entity

import androidx.room.Entity
import androidx.room.PrimaryKey
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.flowfi.data.entity
package com.saadproductlabs.mizafi.data.entity

import androidx.room.Entity
import androidx.room.PrimaryKey
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.example.flowfi.data.repository
package com.saadproductlabs.mizafi.data.repository

import com.example.flowfi.data.dao.SavingsGoalDao
import com.example.flowfi.data.entity.SavingsGoalEntity
import com.saadproductlabs.mizafi.data.dao.SavingsGoalDao
import com.saadproductlabs.mizafi.data.entity.SavingsGoalEntity
import kotlinx.coroutines.flow.Flow

interface SavingsGoalRepository {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.example.flowfi.data.repository
package com.saadproductlabs.mizafi.data.repository

import com.example.flowfi.data.dao.TransactionDao
import com.example.flowfi.data.entity.TransactionEntity
import com.saadproductlabs.mizafi.data.dao.TransactionDao
import com.saadproductlabs.mizafi.data.entity.TransactionEntity
import kotlinx.coroutines.flow.Flow

interface TransactionRepository {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.example.flowfi.domain
package com.saadproductlabs.mizafi.domain

import com.example.flowfi.data.entity.TransactionEntity
import com.example.flowfi.data.entity.TransactionType
import com.example.flowfi.util.DateUtils
import com.saadproductlabs.mizafi.data.entity.TransactionEntity
import com.saadproductlabs.mizafi.data.entity.TransactionType
import com.saadproductlabs.mizafi.util.DateUtils

data class CategorySpend(
val category: String,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.example.flowfi.domain
package com.saadproductlabs.mizafi.domain

import com.example.flowfi.data.entity.TransactionEntity
import com.example.flowfi.data.entity.TransactionType
import com.example.flowfi.util.DateUtils
import com.saadproductlabs.mizafi.data.entity.TransactionEntity
import com.saadproductlabs.mizafi.data.entity.TransactionType
import com.saadproductlabs.mizafi.util.DateUtils
import kotlin.math.roundToInt

enum class InsightTone {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.example.flowfi.ui.components
package com.saadproductlabs.mizafi.ui.components

import androidx.compose.foundation.Canvas
import androidx.compose.foundation.layout.*
Expand All @@ -12,8 +12,8 @@ import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import com.example.flowfi.domain.CategorySpend
import com.example.flowfi.ui.util.formatCurrency
import com.saadproductlabs.mizafi.domain.CategorySpend
import com.saadproductlabs.mizafi.ui.util.formatCurrency

@Composable
fun CategoryBarChart(
Expand Down
Loading
Loading