You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(README): update coverage badge and testing instructions
- Update coverage badge to XX% in README.md
- Expand testing instructions to include very_good test command
- Add note about updating coverage badge after tests pass
@@ -21,20 +21,34 @@ This app comes packed with all the features you need to launch a professional ne
21
21
22
22
#### 📰 **Dynamic & Engaging Headlines Feed**
23
23
* Display news in a beautiful, performant, infinitely scrolling feed.
24
-
* Strategically display in-feed messages to drive user actions. Show calls-to-action like 'Create an Account' to anonymous users or 'Upgrade to Premium' to authenticated users, all based on configurable rules.
24
+
***Customizable Display:** Users can personalize their feed by choosing headline density (compact, standard, comfortable) and image style (hidden, small thumbnail, large thumbnail).
25
+
***Rich In-Feed Decorators:** Beyond simple calls-to-action, the feed dynamically injects items like `CallToActionItem` (e.g., link account, upgrade, rate app, enable notifications) and `ContentCollectionItem` (e.g., suggested topics/sources to follow), all managed by configurable rules and user interaction status.
25
26
> **Your Advantage:** You get a production-quality feed system instantly. Skip the months of complex UI work and state management. ⏱️
26
27
27
28
#### 🔍 **Advanced Content Filtering & Search**
28
-
* Let users filter headlines by categories, sources, and countries.
29
-
* Includes a dedicated search page to help users find specific content quickly.
29
+
***Comprehensive Filtering:** Let users filter headlines by `Topic`, `Source`, and `Country` using a dedicated filter interface.
30
+
***"Followed Items" Filter:** Users can instantly filter the feed to show only content from their followed topics, sources, and countries.
31
+
***Unified Search:** Includes a dedicated search page to help users find specific content quickly, with the ability to search across headlines, topics, sources, and countries.
30
32
> **Your Advantage:** Give your users powerful content discovery tools that keep them engaged and coming back for more. 🎯
31
33
32
-
#### 💰 **Extensible Monetization with In-Feed Ads**
33
-
* Built with a clean, provider-agnostic ad architecture that makes monetization simple and flexible.
34
-
* Features a decoupled design, allowing easy integration and swapping of various ad networks (e.g., Google AdMob, Meta Audience Network) without rewriting core logic.
35
-
* Comes with a ready-to-go Google AdMob integration for native ads in the feed.
36
-
***Theme-Aware Ads:** Native ads automatically adapt their appearance to match the user's selected theme, including light/dark modes and accent colors, ensuring a seamless and visually consistent user experience.
37
-
***Format-Aware Ads:** The ad system intelligently requests the appropriate native ad format (e.g., small or large template) based on the user's feed display preferences, ensuring ads always fit perfectly within the surrounding content.
Go beyond basic ad banners. This app includes a sophisticated, provider-agnostic monetization engine designed for flexibility, performance, and a seamless user experience.
36
+
37
+
***Multi-Platform by Design:** The entire ad system is built on a provider-agnostic abstraction, giving you the freedom to choose your monetization strategy. It comes with pre-built, production-ready providers for:
38
+
***Google AdMob:** The industry standard, ready to go out of the box.
39
+
***Custom Ad Server:** Use the `LocalAdProvider` to serve ads directly from your own backend, giving you full control over your ad inventory and revenue.
40
+
***Demo Provider:** A built-in placeholder provider that makes development and testing a breeze, without needing live ad network credentials.
41
+
42
+
***Seamless Integration, Not Intrusion:** Ads are designed to complement your content, not detract from it.
43
+
***Theme-Aware Styling:** Native ads automatically inherit their look and feel from the user's selected theme (light/dark mode, colors, fonts), making them feel like a natural part of the UI.
44
+
***Format-Aware Loading:** The system intelligently requests the right ad format (e.g., small or large templates) to match the user's feed layout preferences, ensuring a perfect fit every time.
45
+
46
+
***Optimized for Performance:** A fast, fluid user experience is paramount.
47
+
***Intelligent Caching:** An `InlineAdCacheService` efficiently caches native and banner ads to ensure buttery-smooth scrolling in feeds, minimizing network requests and eliminating UI jank.
48
+
***Proactive Interstitial Loading:** A dedicated manager pre-loads full-screen interstitial ads in the background, so they are ready to be displayed instantly during navigation without any lag.
49
+
50
+
***Powerful Remote Control:** All ad behavior is driven by the backend `RemoteConfig`. You can remotely control ad frequency, placement rules, and even switch the primary ad provider—all without shipping a new app update.
51
+
38
52
> **Your Advantage:** Start generating revenue from day one with a highly extensible and robust ad system that’s built to scale with your business. 💸
39
53
40
54
#### 🔐 **Robust User Authentication**
@@ -46,20 +60,24 @@ Secure and flexible authentication flows are built-in:
46
60
47
61
#### 🧑🎨 **Personalized User Accounts & Preferences**
48
62
Users can tailor their experience:
49
-
***Content Preferences:** Follow/unfollow categories, sources, and countries.
63
+
***Content Preferences:** Follow/unfollow `Topic`s, `Source`s, and `Country`s.
50
64
***Saved Headlines:** Bookmark articles for easy access later.
65
+
***Decorator Interaction Tracking:** User interactions with in-feed decorators (e.g., "Link Account" prompts) are tracked and persisted, ensuring a personalized and non-repetitive experience.
51
66
> **Your Advantage:** Built-in personalization features that drive user retention and create a sticky app experience. ❤️
52
67
53
68
#### ⚙️ **Customizable App Settings**
54
69
Offer users control over their app experience:
55
-
***Appearance:** Light/Dark/System themes, accent colors (via FlexColorScheme), font choices, and text scaling.
56
-
***Feed Display:** Customize how headlines are presented.
70
+
***Appearance:** Configure base theme (Light/Dark/System), accent colors (via FlexColorScheme), font choices (family, size, weight).
71
+
***Feed Display:** Customize how headlines are presented, including `HeadlineDensity` and `HeadlineImageStyle`, and visibility of source/publish date.
72
+
***Language Selection:** Choose the application's display language.
57
73
> **Your Advantage:** Deliver a premium, adaptable user experience that caters to individual needs without writing any code. 🔧
58
74
59
75
#### 📡 **Backend-Driven Behavior**
60
76
The app is built to respond to commands from your backend API, allowing for dynamic control over the user experience:
77
+
***Remote Configuration:** Fetches global settings (`RemoteConfig`) from the backend, including ad configurations, user preference limits, and overall app status.
61
78
***Maintenance Mode:** Displays a full-screen "kill switch" page when the backend signals that the service is temporarily unavailable.
62
79
***Forced Updates:** Shows a non-dismissible "Update Required" screen when a new version is mandatory, guiding users to the app store.
80
+
***Dynamic Status Checks:** The `AppStatusService` proactively monitors the app's lifecycle and periodically checks for server-side status changes, ensuring real-time responsiveness.
63
81
> **Your Advantage:** The client-side logic to handle critical operational states is already implemented. Your app can gracefully manage server downtime and enforce version updates without you needing to code these complex, full-screen takeover flows. 🛠️
64
82
65
83
#### 📱 **Adaptive UI for All Screens**
@@ -69,8 +87,9 @@ Built with `flutter_adaptive_scaffold`, the app offers responsive navigation and
69
87
#### 🏗️ **Clean & Modern Architecture**
70
88
Developed with best practices for a maintainable and scalable codebase:
71
89
***Flutter & Dart:** Cutting-edge mobile development.
72
-
***BLoC Pattern:** Predictable and robust state management.
90
+
***BLoC Pattern:** Predictable and robust state management, enhanced with `bloc_concurrency` transformers (droppable, restartable, sequential) for advanced event handling.
73
91
***GoRouter:** Well-structured and powerful navigation.
92
+
***KV Storage Service:** Utilizes `KVStorageService` for secure and efficient local key-value storage.
74
93
> **Your Advantage:** The app is built on a clean, modern architecture that's easy to understand and maintain. It's solid and built to last. 📈
75
94
76
95
#### ⚙️ **Flexible Environment Configuration**
@@ -89,7 +108,7 @@ Get started for free and purchase when you're ready to launch!
89
108
90
109
***TRY IT:** Download and explore the full source code under the PolyForm Free Trial [license](LICENSE). Perfect for evaluation.
91
110
***BUY IT:** One-time payment for a lifetime license to publish unlimited commercial apps.
92
-
***GET YOURS:**[**Purchase via GitHub Sponsors**](https://github.com/sponsors/flutter-news-app-full-source-code).
111
+
***GET YOURS:**[**Purchase via GitHub Sponsors**](https://github.sponsors/flutter-news-app-full-source-code).
93
112
94
113
> [!NOTE]
95
114
> *A single purchase provides a commercial license for every repository within the [Flutter News App - Full Source Code Toolkit](https://github.com/flutter-news-app-full-source-code). No other purchases are needed..*
@@ -110,4 +129,6 @@ This project aims for high test coverage to ensure quality and reliability.
110
129
111
130
* Run tests with:
112
131
```bash
113
-
flutter test
132
+
very_good test --min-coverage 90
133
+
```
134
+
***Update Coverage Badge:** After `very_good test --min-coverage 90` passes, run `very_good test --min-coverage 100`. If it fails, get the integer percentage from the output (e.g., `97` from `97.55%`). If it passes, use `100`. Then, update `XX`in``in`README.md`.
0 commit comments