mirror of
https://github.com/andwati/ledga.git
synced 2026-10-29 16:32:21 +00:00
UI overhaul - Modern fintech bento design system (LedgaText, Space, Radius, Motion). - Inter font via Google Fonts. - New PillTabBar + LedgaTopBar; 4-tab IA: Home / Activity / Insights / You. - Home rewritten as bento cards; new AccountChip leading slot. - Activity wraps Transactions + Trends behind a segmented control. - Trends gains a GitHub-style heatmap calendar. - You consolidates Settings into grouped bento cards. Insights (Phase C) - Rule engine + 6 rules: anomaly (z-score), recurring detection, fee tips, Fuliza outstanding, Fuliza auto-pay pairing, positive nudges. - Daily InsightWorker (3 AM); generates on screen entry for first-time users. - Natural-key dedup so dismiss/snooze state survives re-runs. - Home teaser surfaces the top active insight. Goals (Phase D) - New Goal entity + GoalContribution table. - 3 contribution rules: AllSavingsDeposits, ToRecipient, Manual. - Rule-based contributions compute live via SQL aggregation (no duplicate rows). Manual rule uses goal_contributions table. - GoalsScreen with progress rings + status badges; AddGoalSheet; GoalDetailScreen with contributing-transactions list. - "Add to goal" entry in TransactionDetailSheet for Manual goals. Multi-SIM (Phase E) - MpesaAccount entity captured per-subscription on SMS receive (SubscriptionManager.EXTRA_SUBSCRIPTION_INDEX with legacy fallback). - READ_PHONE_STATE permission (optional; falls back to "Line N" labels). - Every screen-facing query is account-scoped via TransactionRepository composing with the selected-account flow. - AccountSwitcherSheet on Home; AccountsScreen with rename / recolor / set-primary; BackfillScreen with 3-prong attribution (SMS-inbox auto, date range, per-transaction manual via TransactionDetailSheet). In-app updates (Phase F + G) - Chunked APK download with progress reporting. - UpdateRepository state machine (Idle → Downloading → Ready → Failed). - Full-screen UpdateScreen with parsed What's new / Fixes sections. - "Remind me later" persists dismissed version. - Background UpdateCheckWorker pre-fetches APK on unmetered network. - Home banner: "available" vs "ready to install" copy variants. - Proactive REQUEST_INSTALL_PACKAGES permission prompt with settings deep-link before firing the installer intent. Parser quality - Hustler Fund "sent KshX to NAME" amount-first phrasing now matches. - "Give cash to AGENT" agent-deposit format recognized as DEPOSIT. - Fuliza auto-pay recipient labels rewritten as "Fuliza overdraft (auto-cleared / auto-partial)" for clearer transaction lists. - 8 new real-world regression fixtures from sanitized export. - Audit: 0 UNKNOWN against 6,565-transaction real history (was 838). Database - v3 schema: mpesa_accounts, goals, goal_contributions, insights tables. - transactions gains accountId (FK), note. - Explicit MIGRATION_1_2 + MIGRATION_2_3. Tests - 65 unit tests across parser (33), rule engine (14), goal rules (8), update logic (8), parser audit (1), insights dry-run (1). - Two test suites (audit, dry-run) read the local export when present, skip cleanly in CI. Design spec - LEDGA_REDESIGN.md captures the full direction + tokens + per-screen wireframes + phased PR plan. versionCode 3, versionName 1.3.0.
66 lines
2.7 KiB
XML
66 lines
2.7 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
xmlns:tools="http://schemas.android.com/tools">
|
|
|
|
<uses-permission android:name="android.permission.RECEIVE_SMS" />
|
|
<uses-permission android:name="android.permission.READ_SMS" />
|
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
|
<uses-permission android:name="android.permission.INTERNET" />
|
|
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
|
<!-- Multi-SIM: needed to resolve subscription IDs to carrier/line names.
|
|
Gracefully optional — without it we fall back to "Line 1" / "Line 2" labels. -->
|
|
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
|
|
|
<application
|
|
android:name=".LedgaApp"
|
|
android:allowBackup="true"
|
|
android:icon="@mipmap/ic_launcher"
|
|
android:roundIcon="@mipmap/ic_launcher_round"
|
|
android:label="@string/app_name"
|
|
android:supportsRtl="true"
|
|
android:theme="@style/Theme.Ledga">
|
|
|
|
<!-- Remove default WorkManager initializer (using Hilt custom init) -->
|
|
<provider
|
|
android:name="androidx.startup.InitializationProvider"
|
|
android:authorities="${applicationId}.androidx-startup"
|
|
android:exported="false"
|
|
tools:node="merge">
|
|
<meta-data
|
|
android:name="androidx.work.WorkManagerInitializer"
|
|
android:value="androidx.startup"
|
|
tools:node="remove" />
|
|
</provider>
|
|
|
|
<activity
|
|
android:name=".MainActivity"
|
|
android:exported="true"
|
|
android:theme="@style/Theme.Ledga.Splash">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.MAIN" />
|
|
<category android:name="android.intent.category.LAUNCHER" />
|
|
</intent-filter>
|
|
</activity>
|
|
|
|
<provider
|
|
android:name="androidx.core.content.FileProvider"
|
|
android:authorities="${applicationId}.fileprovider"
|
|
android:exported="false"
|
|
android:grantUriPermissions="true">
|
|
<meta-data
|
|
android:name="android.support.FILE_PROVIDER_PATHS"
|
|
android:resource="@xml/file_paths" />
|
|
</provider>
|
|
|
|
<receiver
|
|
android:name=".receiver.SmsReceiver"
|
|
android:exported="true"
|
|
android:permission="android.permission.BROADCAST_SMS">
|
|
<intent-filter android:priority="999">
|
|
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
|
|
</intent-filter>
|
|
</receiver>
|
|
|
|
</application>
|
|
</manifest>
|