From 93826a0aca21952dc26037f6448aa4c59c9cffca Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Wed, 18 Jun 2025 10:34:14 +0200 Subject: [PATCH 01/12] update java to 17 --- Frontend/android/app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Frontend/android/app/build.gradle b/Frontend/android/app/build.gradle index 9700cd68..ebe7c415 100644 --- a/Frontend/android/app/build.gradle +++ b/Frontend/android/app/build.gradle @@ -36,12 +36,12 @@ android { compileSdkVersion 35 compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = '11' + jvmTarget = '17' } sourceSets { From 65f4bb5cf65249a558794763fe7306c3cbaff9cf Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Wed, 18 Jun 2025 13:32:57 +0200 Subject: [PATCH 02/12] add google mobile add to pubspec --- Frontend/pubspec.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/Frontend/pubspec.yaml b/Frontend/pubspec.yaml index 70270e1a..45e03da6 100644 --- a/Frontend/pubspec.yaml +++ b/Frontend/pubspec.yaml @@ -43,6 +43,7 @@ dependencies: share_plus: ^11.0.0 app_settings: ^6.1.1 pwa_install: ^0.0.6 + google_mobile_ads: ^6.0.0 dev_dependencies: flutter_test: From 9df6b7bbea0b545957a4ab889939613f8c1de610 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Wed, 18 Jun 2025 13:33:30 +0200 Subject: [PATCH 03/12] android config to handle google mobile ad --- Frontend/android/app/build.gradle | 24 +- .../android/app/src/main/AndroidManifest.xml | 4 + .../mzansiinnovationhub/mih}/MainActivity.kt | 2 +- Frontend/android/build.gradle | 10 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- Frontend/android/settings.gradle | 1 + Frontend/ios/Podfile.lock | 80 +--- Frontend/ios/Runner.xcodeproj/project.pbxproj | 18 - .../xcshareddata/xcschemes/Runner.xcscheme | 2 + Frontend/pubspec.lock | 358 ++++++++---------- 10 files changed, 202 insertions(+), 299 deletions(-) rename Frontend/android/app/src/main/kotlin/{com/example/patient_manager => za/co/mzansiinnovationhub/mih}/MainActivity.kt (98%) diff --git a/Frontend/android/app/build.gradle b/Frontend/android/app/build.gradle index ebe7c415..897a6253 100644 --- a/Frontend/android/app/build.gradle +++ b/Frontend/android/app/build.gradle @@ -31,9 +31,9 @@ if (keystorePropertiesFile.exists()) { android { namespace "za.co.mzansiinnovationhub.mih" compileSdkVersion flutter.compileSdkVersion - ndkVersion = "27.0.12077973" + // ndkVersion = "27.0.12077973" // ndkVersion flutter.ndkVersion - compileSdkVersion 35 + // compileSdkVersion 35 compileOptions { sourceCompatibility JavaVersion.VERSION_17 @@ -54,9 +54,10 @@ android { // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion 24 //flutter.minSdkVersion - targetSdkVersion 34 //flutter.targetSdkVersion + targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName + multiDexEnabled true } signingConfigs { @@ -84,8 +85,21 @@ flutter { dependencies { // implementation("com.google.android.material:material:") - implementation("com.google.android.material:material:1.12.0") + implementation "com.google.android.material:material:1.12.0" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + implementation(platform("org.jetbrains.kotlin:kotlin-bom:$kotlin_version")) // implementation 'com.huawei.agconnect:agconnect-core:1.5.2.300' } -// apply plugin: 'com.huawei.agconnect' \ No newline at end of file +// apply plugin: 'com.huawei.agconnect' +configurations.all { + resolutionStrategy { + eachDependency { details -> + if (details.requested.group == 'org.jetbrains.kotlin') { + if (!details.requested.version.startsWith(rootProject.ext.kotlin_version)) { + details.useVersion rootProject.ext.kotlin_version + } + } + } + } +} diff --git a/Frontend/android/app/src/main/AndroidManifest.xml b/Frontend/android/app/src/main/AndroidManifest.xml index 9a6761d7..b94bfa1b 100644 --- a/Frontend/android/app/src/main/AndroidManifest.xml +++ b/Frontend/android/app/src/main/AndroidManifest.xml @@ -46,6 +46,10 @@ + + diff --git a/Frontend/android/app/src/main/kotlin/com/example/patient_manager/MainActivity.kt b/Frontend/android/app/src/main/kotlin/za/co/mzansiinnovationhub/mih/MainActivity.kt similarity index 98% rename from Frontend/android/app/src/main/kotlin/com/example/patient_manager/MainActivity.kt rename to Frontend/android/app/src/main/kotlin/za/co/mzansiinnovationhub/mih/MainActivity.kt index 57ffce9d..3ba56267 100644 --- a/Frontend/android/app/src/main/kotlin/com/example/patient_manager/MainActivity.kt +++ b/Frontend/android/app/src/main/kotlin/za/co/mzansiinnovationhub/mih/MainActivity.kt @@ -3,4 +3,4 @@ package za.co.mzansiinnovationhub.mih import io.flutter.embedding.android.FlutterFragmentActivity class MainActivity: FlutterFragmentActivity() { -} +} \ No newline at end of file diff --git a/Frontend/android/build.gradle b/Frontend/android/build.gradle index ed833606..0e62ca7d 100644 --- a/Frontend/android/build.gradle +++ b/Frontend/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '2.0.20' + ext.kotlin_version = '2.1.21' repositories { google() mavenCentral() @@ -7,7 +7,7 @@ buildscript { } dependencies { - // classpath "com.android.tools.build:gradle:8.8.0" + classpath "com.android.tools.build:gradle:8.8.1" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // classpath 'com.huawei.agconnect:agcp:1.5.2.300' } @@ -25,9 +25,9 @@ rootProject.buildDir = '../build' subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } -subprojects { - project.evaluationDependsOn(':app') -} +//subprojects { +// project.evaluationDependsOn(':app') +//} tasks.register("clean", Delete) { delete rootProject.buildDir diff --git a/Frontend/android/gradle/wrapper/gradle-wrapper.properties b/Frontend/android/gradle/wrapper/gradle-wrapper.properties index df97d72b..79eb9d00 100644 --- a/Frontend/android/gradle/wrapper/gradle-wrapper.properties +++ b/Frontend/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/Frontend/android/settings.gradle b/Frontend/android/settings.gradle index d6f88193..b97b87ee 100644 --- a/Frontend/android/settings.gradle +++ b/Frontend/android/settings.gradle @@ -18,6 +18,7 @@ pluginManagement { plugins { id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false + id "org.jetbrains.kotlin.android" version "2.1.21" apply false } } diff --git a/Frontend/ios/Podfile.lock b/Frontend/ios/Podfile.lock index ae6295f1..ef183a27 100644 --- a/Frontend/ios/Podfile.lock +++ b/Frontend/ios/Podfile.lock @@ -47,63 +47,17 @@ PODS: - geolocator_apple (1.2.0): - Flutter - FlutterMacOS - - GoogleDataTransport (10.1.0): - - nanopb (~> 3.30910.0) - - PromisesObjC (~> 2.4) - - GoogleMLKit/BarcodeScanning (7.0.0): - - GoogleMLKit/MLKitCore - - MLKitBarcodeScanning (~> 6.0.0) - - GoogleMLKit/MLKitCore (7.0.0): - - MLKitCommon (~> 12.0.0) - - GoogleToolboxForMac/Defines (4.2.1) - - GoogleToolboxForMac/Logger (4.2.1): - - GoogleToolboxForMac/Defines (= 4.2.1) - - "GoogleToolboxForMac/NSData+zlib (4.2.1)": - - GoogleToolboxForMac/Defines (= 4.2.1) - - GoogleUtilities/Environment (8.0.2): - - GoogleUtilities/Privacy - - GoogleUtilities/Logger (8.0.2): - - GoogleUtilities/Environment - - GoogleUtilities/Privacy - - GoogleUtilities/Privacy (8.0.2) - - GoogleUtilities/UserDefaults (8.0.2): - - GoogleUtilities/Logger - - GoogleUtilities/Privacy - - GTMSessionFetcher/Core (3.5.0) - local_auth_darwin (0.0.1): - Flutter - FlutterMacOS - - MLImage (1.0.0-beta6) - - MLKitBarcodeScanning (6.0.0): - - MLKitCommon (~> 12.0) - - MLKitVision (~> 8.0) - - MLKitCommon (12.0.0): - - GoogleDataTransport (~> 10.0) - - GoogleToolboxForMac/Logger (< 5.0, >= 4.2.1) - - "GoogleToolboxForMac/NSData+zlib (< 5.0, >= 4.2.1)" - - GoogleUtilities/Logger (~> 8.0) - - GoogleUtilities/UserDefaults (~> 8.0) - - GTMSessionFetcher/Core (< 4.0, >= 3.3.2) - - MLKitVision (8.0.0): - - GoogleToolboxForMac/Logger (< 5.0, >= 4.2.1) - - "GoogleToolboxForMac/NSData+zlib (< 5.0, >= 4.2.1)" - - GTMSessionFetcher/Core (< 4.0, >= 3.3.2) - - MLImage (= 1.0.0-beta6) - - MLKitCommon (~> 12.0) - - mobile_scanner (6.0.2): + - mobile_scanner (7.0.0): - Flutter - - GoogleMLKit/BarcodeScanning (~> 7.0.0) - - nanopb (3.30910.0): - - nanopb/decode (= 3.30910.0) - - nanopb/encode (= 3.30910.0) - - nanopb/decode (3.30910.0) - - nanopb/encode (3.30910.0) + - FlutterMacOS - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - printing (1.0.0): - Flutter - - PromisesObjC (2.4.0) - SDWebImage (5.20.0): - SDWebImage/Core (= 5.20.0) - SDWebImage/Core (5.20.0) @@ -131,7 +85,7 @@ DEPENDENCIES: - flutter_tts (from `.symlinks/plugins/flutter_tts/ios`) - geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`) - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) - - mobile_scanner (from `.symlinks/plugins/mobile_scanner/ios`) + - mobile_scanner (from `.symlinks/plugins/mobile_scanner/darwin`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - printing (from `.symlinks/plugins/printing/ios`) - share_plus (from `.symlinks/plugins/share_plus/ios`) @@ -144,17 +98,6 @@ SPEC REPOS: trunk: - DKImagePickerController - DKPhotoGallery - - GoogleDataTransport - - GoogleMLKit - - GoogleToolboxForMac - - GoogleUtilities - - GTMSessionFetcher - - MLImage - - MLKitBarcodeScanning - - MLKitCommon - - MLKitVision - - nanopb - - PromisesObjC - SDWebImage - SwiftyGif @@ -178,7 +121,7 @@ EXTERNAL SOURCES: local_auth_darwin: :path: ".symlinks/plugins/local_auth_darwin/darwin" mobile_scanner: - :path: ".symlinks/plugins/mobile_scanner/ios" + :path: ".symlinks/plugins/mobile_scanner/darwin" path_provider_foundation: :path: ".symlinks/plugins/path_provider_foundation/darwin" printing: @@ -205,26 +148,15 @@ SPEC CHECKSUMS: flutter_native_splash: 35ddbc7228eafcb3969dcc5f1fbbe27c1145a4f0 flutter_tts: b88dbc8655d3dc961bc4a796e4e16a4cc1795833 geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e - GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7 - GoogleMLKit: eff9e23ec1d90ea4157a1ee2e32a4f610c5b3318 - GoogleToolboxForMac: d1a2cbf009c453f4d6ded37c105e2f67a32206d8 - GoogleUtilities: 26a3abef001b6533cf678d3eb38fd3f614b7872d - GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391 - MLImage: 0ad1c5f50edd027672d8b26b0fee78a8b4a0fc56 - MLKitBarcodeScanning: 0a3064da0a7f49ac24ceb3cb46a5bc67496facd2 - MLKitCommon: 07c2c33ae5640e5380beaaa6e4b9c249a205542d - MLKitVision: 45e79d68845a2de77e2dd4d7f07947f0ed157b0e - mobile_scanner: af8f71879eaba2bbcb4d86c6a462c3c0e7f23036 - nanopb: fad817b59e0457d11a5dfbde799381cd727c1275 + mobile_scanner: 9157936403f5a0644ca3779a38ff8404c5434a93 path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 printing: 54ff03f28fe9ba3aa93358afb80a8595a071dd07 - PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 SDWebImage: 73c6079366fea25fa4bb9640d5fb58f0893facd8 share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a shared_preferences_foundation: 9e1978ff2562383bd5676f64ec4e9aa8fa06a6f7 SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4 - syncfusion_flutter_pdfviewer: dfb514751af5b6b71e504c9c04a2e4ddbc1dd895 + syncfusion_flutter_pdfviewer: 90dc48305d2e33d4aa20681d1e98ddeda891bc14 url_launcher_ios: 694010445543906933d732453a59da0a173ae33d webview_flutter_wkwebview: 1821ceac936eba6f7984d89a9f3bcb4dea99ebb2 diff --git a/Frontend/ios/Runner.xcodeproj/project.pbxproj b/Frontend/ios/Runner.xcodeproj/project.pbxproj index 338810dc..5bb64111 100644 --- a/Frontend/ios/Runner.xcodeproj/project.pbxproj +++ b/Frontend/ios/Runner.xcodeproj/project.pbxproj @@ -198,7 +198,6 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, CD2265EBFCCA7833EF5BB6D4 /* [CP] Embed Pods Frameworks */, - 74234597279ED22D9553D74E /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -308,23 +307,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 74234597279ED22D9553D74E /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Copy Pods Resources"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; diff --git a/Frontend/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/Frontend/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 15cada48..e3773d42 100644 --- a/Frontend/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/Frontend/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -26,6 +26,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit" shouldUseLaunchSchemeArgsEnv = "YES"> =3.7.0-0 <3.9.0" - flutter: ">=3.27.0" + dart: ">=3.8.0 <3.9.0" + flutter: ">=3.29.0" From 0b8fb4cc46714aa388a1fbb199abec4aa729577a Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Wed, 18 Jun 2025 14:45:41 +0200 Subject: [PATCH 04/12] initialise ad service --- Frontend/lib/main_dev.dart | 2 ++ Frontend/lib/main_prod.dart | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Frontend/lib/main_dev.dart b/Frontend/lib/main_dev.dart index 94fcf9db..6ce60c5c 100644 --- a/Frontend/lib/main_dev.dart +++ b/Frontend/lib/main_dev.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; import 'package:pwa_install/pwa_install.dart'; import 'mih_config/mih_env.dart'; import '../../main.dart'; @@ -15,6 +16,7 @@ void main() async { apiBasePath: "/auth", ); // setUrlStrategy(PathUrlStrategy()); + MobileAds.instance.initialize(); PWAInstall().setup(installCallback: () { debugPrint('APP INSTALLED!'); }); diff --git a/Frontend/lib/main_prod.dart b/Frontend/lib/main_prod.dart index 30cb9c95..b1277242 100644 --- a/Frontend/lib/main_prod.dart +++ b/Frontend/lib/main_prod.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; import 'package:pwa_install/pwa_install.dart'; import 'mih_config/mih_env.dart'; import '../../main.dart'; @@ -15,6 +16,7 @@ void main() async { apiBasePath: "/auth", ); // setUrlStrategy(PathUrlStrategy()); + MobileAds.instance.initialize(); FlutterNativeSplash.remove(); PWAInstall().setup(installCallback: () { debugPrint('APP INSTALLED!'); From 1bfb878d0a2b548f58c921d7eb28311e74e51a0f Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Wed, 18 Jun 2025 14:46:05 +0200 Subject: [PATCH 05/12] add adUnitId env variable --- Frontend/lib/mih_config/mih_env.dart | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Frontend/lib/mih_config/mih_env.dart b/Frontend/lib/mih_config/mih_env.dart index 842552b8..53b5bb44 100644 --- a/Frontend/lib/mih_config/mih_env.dart +++ b/Frontend/lib/mih_config/mih_env.dart @@ -1,3 +1,5 @@ +import 'dart:io'; + enum Enviroment { dev, prod } // @@ -5,6 +7,7 @@ abstract class AppEnviroment { static late String baseApiUrl; static late String baseAiUrl; static late String baseFileUrl; + static late String bannerAdUnitId; static late String whatsappAccessToken; static late String fingerPrintPluginKey; static late Enviroment _enviroment; @@ -18,10 +21,12 @@ abstract class AppEnviroment { baseApiUrl = "http://10.0.2.2:8080"; baseFileUrl = "http://10.0.2.2:9000"; baseAiUrl = "http://10.0.2.2:11434"; - //================= Web Dev Urls ================= + bannerAdUnitId = 'ca-app-pub-3940256099942544/9214589741'; + //================= Web & iOS Dev Urls ================= // baseApiUrl = "http://localhost:8080"; // baseFileUrl = "http://localhost:9000"; // baseAiUrl = "http://localhost:11434"; + // bannerAdUnitId = 'ca-app-pub-3940256099942544/2435281174'; break; } case Enviroment.prod: @@ -29,6 +34,9 @@ abstract class AppEnviroment { baseApiUrl = "https://api.mzansi-innovation-hub.co.za"; baseFileUrl = "https://minio.mzansi-innovation-hub.co.za"; baseAiUrl = "https://ai.mzansi-innovation-hub.co.za"; + bannerAdUnitId = Platform.isAndroid + ? 'ca-app-pub-4781880856775334/8868663088' // Android + : 'Inset-iOS-Unit-Id'; // iOS //fingerPrintPluginKey = 'h5X7a5j14iUZCobI1ZeX'; break; } From 44bb71c0d4b1c0b49292c67cd59b91d7289fa8e6 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Wed, 18 Jun 2025 14:46:13 +0200 Subject: [PATCH 06/12] create banner widget --- .../mih_package_components/mih_banner_ad.dart | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 Frontend/lib/mih_components/mih_package_components/mih_banner_ad.dart diff --git a/Frontend/lib/mih_components/mih_package_components/mih_banner_ad.dart b/Frontend/lib/mih_components/mih_package_components/mih_banner_ad.dart new file mode 100644 index 00000000..95a43efb --- /dev/null +++ b/Frontend/lib/mih_components/mih_package_components/mih_banner_ad.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; +import 'package:mzansi_innovation_hub/mih_config/mih_env.dart'; + +class MihBannerAd extends StatefulWidget { + const MihBannerAd({super.key}); + + @override + State createState() => _MihBannerAdState(); +} + +class _MihBannerAdState extends State { + BannerAd? _bannerAd; + bool _isBannerAdLoaded = false; + final adUnitId = AppEnviroment.bannerAdUnitId; + + void _loadBannerAd() { + _bannerAd = BannerAd( + adUnitId: adUnitId, + request: const AdRequest(), + size: AdSize.banner, + listener: BannerAdListener( + onAdLoaded: (ad) { + debugPrint('$ad loaded.'); + setState(() { + _isBannerAdLoaded = true; + }); + }, + onAdFailedToLoad: (ad, err) { + debugPrint('BannerAd failed to load: $err'); + ad.dispose(); // Dispose the ad to free resources + }, + onAdOpened: (Ad ad) => debugPrint('$ad opened.'), + onAdClosed: (Ad ad) => debugPrint('$ad closed.'), + onAdImpression: (Ad ad) => debugPrint('$ad impression.'), + ), + ); + + _bannerAd!.load(); + } + + @override + void dispose() { + _bannerAd?.dispose(); // Dispose the ad when the widget is removed + super.dispose(); + } + + @override + void initState() { + super.initState(); + _loadBannerAd(); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + _bannerAd != null && _isBannerAdLoaded + ? SizedBox( + width: _bannerAd!.size.width.toDouble(), + height: _bannerAd!.size.height.toDouble(), + child: AdWidget(ad: _bannerAd!)) + : SizedBox(), + ], + ); + } +} From 86577076d4b899f33e60f743e867895b94f63d16 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Wed, 18 Jun 2025 14:46:20 +0200 Subject: [PATCH 07/12] test banner widget --- .../package_tools/package_tool_one.dart | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Frontend/lib/mih_components/mih_package_components/Example/package_tools/package_tool_one.dart b/Frontend/lib/mih_components/mih_package_components/Example/package_tools/package_tool_one.dart index 2b653fc2..ebc87c96 100644 --- a/Frontend/lib/mih_components/mih_package_components/Example/package_tools/package_tool_one.dart +++ b/Frontend/lib/mih_components/mih_package_components/Example/package_tools/package_tool_one.dart @@ -2,6 +2,7 @@ import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:mzansi_innovation_hub/main.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_banner_ad.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart'; @@ -164,6 +165,30 @@ class _PackageToolOneState extends State { ], ), const SizedBox(height: 20), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Ad Test", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + color: MzanziInnovationHub.of(context)! + .theme + .secondaryColor(), + ), + ), + ], + ), + MihBannerAd(), + const SizedBox(height: 10), + Divider( + color: + MzanziInnovationHub.of(context)!.theme.secondaryColor(), + thickness: 2, + ), + const SizedBox(height: 10), MihForm( formKey: _formKey, formFields: [ From 0713373e40cf7f67f78f42665a5abc7861617927 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Thu, 19 Jun 2025 11:18:08 +0200 Subject: [PATCH 08/12] Config iOS ads --- Frontend/ios/Podfile.lock | 15 +++++++++++++++ Frontend/ios/Runner.xcodeproj/project.pbxproj | 18 ++++++++++++++++++ Frontend/ios/Runner/Info.plist | 2 ++ Frontend/lib/mih_config/mih_env.dart | 18 +++++++++--------- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/Frontend/ios/Podfile.lock b/Frontend/ios/Podfile.lock index ef183a27..eca87e34 100644 --- a/Frontend/ios/Podfile.lock +++ b/Frontend/ios/Podfile.lock @@ -47,6 +47,13 @@ PODS: - geolocator_apple (1.2.0): - Flutter - FlutterMacOS + - Google-Mobile-Ads-SDK (12.2.0): + - GoogleUserMessagingPlatform (>= 1.1) + - google_mobile_ads (6.0.0): + - Flutter + - Google-Mobile-Ads-SDK (~> 12.2.0) + - webview_flutter_wkwebview + - GoogleUserMessagingPlatform (3.0.0) - local_auth_darwin (0.0.1): - Flutter - FlutterMacOS @@ -84,6 +91,7 @@ DEPENDENCIES: - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`) - flutter_tts (from `.symlinks/plugins/flutter_tts/ios`) - geolocator_apple (from `.symlinks/plugins/geolocator_apple/darwin`) + - google_mobile_ads (from `.symlinks/plugins/google_mobile_ads/ios`) - local_auth_darwin (from `.symlinks/plugins/local_auth_darwin/darwin`) - mobile_scanner (from `.symlinks/plugins/mobile_scanner/darwin`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) @@ -98,6 +106,8 @@ SPEC REPOS: trunk: - DKImagePickerController - DKPhotoGallery + - Google-Mobile-Ads-SDK + - GoogleUserMessagingPlatform - SDWebImage - SwiftyGif @@ -118,6 +128,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_tts/ios" geolocator_apple: :path: ".symlinks/plugins/geolocator_apple/darwin" + google_mobile_ads: + :path: ".symlinks/plugins/google_mobile_ads/ios" local_auth_darwin: :path: ".symlinks/plugins/local_auth_darwin/darwin" mobile_scanner: @@ -148,6 +160,9 @@ SPEC CHECKSUMS: flutter_native_splash: 35ddbc7228eafcb3969dcc5f1fbbe27c1145a4f0 flutter_tts: b88dbc8655d3dc961bc4a796e4e16a4cc1795833 geolocator_apple: ab36aa0e8b7d7a2d7639b3b4e48308394e8cef5e + Google-Mobile-Ads-SDK: 1dfb0c3cb46c7e2b00b0f4de74a1e06d9ea25d67 + google_mobile_ads: 535223588a6791b7a3cc3513a1bc7b89d12f3e62 + GoogleUserMessagingPlatform: f8d0cdad3ca835406755d0a69aa634f00e76d576 local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391 mobile_scanner: 9157936403f5a0644ca3779a38ff8404c5434a93 path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 diff --git a/Frontend/ios/Runner.xcodeproj/project.pbxproj b/Frontend/ios/Runner.xcodeproj/project.pbxproj index 5bb64111..c9660c5a 100644 --- a/Frontend/ios/Runner.xcodeproj/project.pbxproj +++ b/Frontend/ios/Runner.xcodeproj/project.pbxproj @@ -198,6 +198,7 @@ 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, CD2265EBFCCA7833EF5BB6D4 /* [CP] Embed Pods Frameworks */, + DB0F489F4E77F5797F339DD3 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -361,6 +362,23 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; + DB0F489F4E77F5797F339DD3 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Copy Pods Resources"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ diff --git a/Frontend/ios/Runner/Info.plist b/Frontend/ios/Runner/Info.plist index d82416a0..9a4bd087 100644 --- a/Frontend/ios/Runner/Info.plist +++ b/Frontend/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + GADApplicationIdentifier + ca-app-pub-4781880856775334~6935644635 CADisableMinimumFrameDurationOnPhone CFBundleDevelopmentRegion diff --git a/Frontend/lib/mih_config/mih_env.dart b/Frontend/lib/mih_config/mih_env.dart index 53b5bb44..827c6441 100644 --- a/Frontend/lib/mih_config/mih_env.dart +++ b/Frontend/lib/mih_config/mih_env.dart @@ -18,15 +18,15 @@ abstract class AppEnviroment { case Enviroment.dev: { //================= Android Dev Urls ================= - baseApiUrl = "http://10.0.2.2:8080"; - baseFileUrl = "http://10.0.2.2:9000"; - baseAiUrl = "http://10.0.2.2:11434"; - bannerAdUnitId = 'ca-app-pub-3940256099942544/9214589741'; + // baseApiUrl = "http://10.0.2.2:8080"; + // baseFileUrl = "http://10.0.2.2:9000"; + // baseAiUrl = "http://10.0.2.2:11434"; + // bannerAdUnitId = 'ca-app-pub-3940256099942544/9214589741'; //================= Web & iOS Dev Urls ================= - // baseApiUrl = "http://localhost:8080"; - // baseFileUrl = "http://localhost:9000"; - // baseAiUrl = "http://localhost:11434"; - // bannerAdUnitId = 'ca-app-pub-3940256099942544/2435281174'; + baseApiUrl = "http://localhost:8080"; + baseFileUrl = "http://localhost:9000"; + baseAiUrl = "http://localhost:11434"; + bannerAdUnitId = 'ca-app-pub-3940256099942544/2435281174'; break; } case Enviroment.prod: @@ -36,7 +36,7 @@ abstract class AppEnviroment { baseAiUrl = "https://ai.mzansi-innovation-hub.co.za"; bannerAdUnitId = Platform.isAndroid ? 'ca-app-pub-4781880856775334/8868663088' // Android - : 'Inset-iOS-Unit-Id'; // iOS + : 'ca-app-pub-4781880856775334/6640324682'; // iOS //fingerPrintPluginKey = 'h5X7a5j14iUZCobI1ZeX'; break; } From 9a81e57a18f0921c9ad925f107e6ba7885f175f3 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Thu, 19 Jun 2025 11:22:53 +0200 Subject: [PATCH 09/12] add ad banner to Mzansi Wallet, Tip & Forex Calc --- .../calculator/package_tools/currency_exchange_rate.dart | 3 +++ .../lib/mih_packages/calculator/package_tools/tip_calc.dart | 5 ++++- .../mzansi_wallet/builder/build_loyalty_card_list.dart | 5 ++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Frontend/lib/mih_packages/calculator/package_tools/currency_exchange_rate.dart b/Frontend/lib/mih_packages/calculator/package_tools/currency_exchange_rate.dart index 7982cc89..3f9ac59b 100644 --- a/Frontend/lib/mih_packages/calculator/package_tools/currency_exchange_rate.dart +++ b/Frontend/lib/mih_packages/calculator/package_tools/currency_exchange_rate.dart @@ -1,6 +1,7 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:mzansi_innovation_hub/main.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_banner_ad.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_button.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_dropdwn_field.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_form.dart'; @@ -152,6 +153,8 @@ class _CurrencyExchangeRateState extends State { ), ], ), + SizedBox(height: 10), + MihBannerAd(), ], ), ), diff --git a/Frontend/lib/mih_packages/calculator/package_tools/tip_calc.dart b/Frontend/lib/mih_packages/calculator/package_tools/tip_calc.dart index 0e0793bc..59e4c45f 100644 --- a/Frontend/lib/mih_packages/calculator/package_tools/tip_calc.dart +++ b/Frontend/lib/mih_packages/calculator/package_tools/tip_calc.dart @@ -1,4 +1,5 @@ import 'package:mzansi_innovation_hub/main.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_banner_ad.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_single_child_scroll.dart'; @@ -173,7 +174,7 @@ class _TipCalcState extends State { color: MzanziInnovationHub.of(context)!.theme.secondaryColor(), ), ), - const Divider(), + if (splitBillController.text == "Yes") const Divider(), if (splitBillController.text == "Yes") Row( crossAxisAlignment: CrossAxisAlignment.center, @@ -221,6 +222,8 @@ class _TipCalcState extends State { MzanziInnovationHub.of(context)!.theme.secondaryColor(), ), ), + SizedBox(height: 10), + MihBannerAd(), // if (splitBillController.text == "Yes") const Divider(), ], ), diff --git a/Frontend/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart b/Frontend/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart index 56c5ea89..5a05bb6d 100644 --- a/Frontend/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart +++ b/Frontend/lib/mih_packages/mzansi_wallet/builder/build_loyalty_card_list.dart @@ -1,5 +1,6 @@ import 'package:flutter_speed_dial/flutter_speed_dial.dart'; import 'package:mzansi_innovation_hub/main.dart'; +import 'package:mzansi_innovation_hub/mih_components/mih_package_components/mih_banner_ad.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_alert_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_mzansi_wallet_services.dart'; import 'package:mzansi_innovation_hub/mih_services/mih_validation_services.dart'; @@ -448,7 +449,9 @@ class _BuildLoyaltyCardListState extends State { ), ], ), - ) + ), + SizedBox(height: 10), + MihBannerAd(), ], ), ), From 0a8d957c9bd2e724abec88a2cd202db227dc4430 Mon Sep 17 00:00:00 2001 From: Yasien Mac Mini Date: Thu, 19 Jun 2025 13:19:17 +0200 Subject: [PATCH 10/12] . --- Frontend/lib/mih_config/mih_env.dart | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Frontend/lib/mih_config/mih_env.dart b/Frontend/lib/mih_config/mih_env.dart index 827c6441..87fa0aca 100644 --- a/Frontend/lib/mih_config/mih_env.dart +++ b/Frontend/lib/mih_config/mih_env.dart @@ -18,15 +18,15 @@ abstract class AppEnviroment { case Enviroment.dev: { //================= Android Dev Urls ================= - // baseApiUrl = "http://10.0.2.2:8080"; - // baseFileUrl = "http://10.0.2.2:9000"; - // baseAiUrl = "http://10.0.2.2:11434"; - // bannerAdUnitId = 'ca-app-pub-3940256099942544/9214589741'; + baseApiUrl = "http://10.0.2.2:8080"; + baseFileUrl = "http://10.0.2.2:9000"; + baseAiUrl = "http://10.0.2.2:11434"; + bannerAdUnitId = 'ca-app-pub-3940256099942544/9214589741'; //================= Web & iOS Dev Urls ================= - baseApiUrl = "http://localhost:8080"; - baseFileUrl = "http://localhost:9000"; - baseAiUrl = "http://localhost:11434"; - bannerAdUnitId = 'ca-app-pub-3940256099942544/2435281174'; + // baseApiUrl = "http://localhost:8080"; + // baseFileUrl = "http://localhost:9000"; + // baseAiUrl = "http://localhost:11434"; + // bannerAdUnitId = 'ca-app-pub-3940256099942544/2435281174'; break; } case Enviroment.prod: From 0c2abb063e39a61f647660d3c83b96babc151091 Mon Sep 17 00:00:00 2001 From: yaso Date: Fri, 20 Jun 2025 14:27:01 +0200 Subject: [PATCH 11/12] fix initiation if web --- Frontend/lib/main_dev.dart | 25 ++++++++++++++++++++++--- Frontend/lib/main_prod.dart | 28 ++++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/Frontend/lib/main_dev.dart b/Frontend/lib/main_dev.dart index 6ce60c5c..914f8e33 100644 --- a/Frontend/lib/main_dev.dart +++ b/Frontend/lib/main_dev.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; import 'package:google_mobile_ads/google_mobile_ads.dart'; @@ -7,16 +8,34 @@ import '../../main.dart'; import 'package:supertokens_flutter/supertokens.dart'; // import 'package:flutter_web_plugins/flutter_web_plugins.dart'; +// void main() async { +// WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); +// FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); +// AppEnviroment.setupEnv(Enviroment.dev); +// SuperTokens.init( +// apiDomain: AppEnviroment.baseApiUrl, +// apiBasePath: "/auth", +// ); +// // setUrlStrategy(PathUrlStrategy()); +// MobileAds.instance.initialize(); +// PWAInstall().setup(installCallback: () { +// debugPrint('APP INSTALLED!'); +// }); +// FlutterNativeSplash.remove(); +// runApp(const MzanziInnovationHub()); +// } + void main() async { WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); - AppEnviroment.setupEnv(Enviroment.dev); + await AppEnviroment.setupEnv(Enviroment.dev); SuperTokens.init( apiDomain: AppEnviroment.baseApiUrl, apiBasePath: "/auth", ); - // setUrlStrategy(PathUrlStrategy()); - MobileAds.instance.initialize(); + if (!kIsWeb) { + MobileAds.instance.initialize(); + } PWAInstall().setup(installCallback: () { debugPrint('APP INSTALLED!'); }); diff --git a/Frontend/lib/main_prod.dart b/Frontend/lib/main_prod.dart index b1277242..eac1ff86 100644 --- a/Frontend/lib/main_prod.dart +++ b/Frontend/lib/main_prod.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart'; import 'package:google_mobile_ads/google_mobile_ads.dart'; @@ -7,19 +8,38 @@ import '../../main.dart'; import 'package:supertokens_flutter/supertokens.dart'; // import 'package:flutter_web_plugins/flutter_web_plugins.dart'; +// void main() async { +// WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); +// FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); +// AppEnviroment.setupEnv(Enviroment.prod); +// SuperTokens.init( +// apiDomain: AppEnviroment.baseApiUrl, +// apiBasePath: "/auth", +// ); +// // setUrlStrategy(PathUrlStrategy()); +// if (!kIsWeb) { +// MobileAds.instance.initialize(); +// } +// FlutterNativeSplash.remove(); +// PWAInstall().setup(installCallback: () { +// debugPrint('APP INSTALLED!'); +// }); +// runApp(const MzanziInnovationHub()); +// } void main() async { WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); - AppEnviroment.setupEnv(Enviroment.prod); + await AppEnviroment.setupEnv(Enviroment.dev); SuperTokens.init( apiDomain: AppEnviroment.baseApiUrl, apiBasePath: "/auth", ); - // setUrlStrategy(PathUrlStrategy()); - MobileAds.instance.initialize(); - FlutterNativeSplash.remove(); + if (!kIsWeb) { + MobileAds.instance.initialize(); + } PWAInstall().setup(installCallback: () { debugPrint('APP INSTALLED!'); }); + FlutterNativeSplash.remove(); runApp(const MzanziInnovationHub()); } From 048d26fac69393b92e6a9814698e7b790695ef36 Mon Sep 17 00:00:00 2001 From: yaso Date: Fri, 20 Jun 2025 14:27:49 +0200 Subject: [PATCH 12/12] supertokens requiremments python sdk --- backend/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index 694a5bb0..d0594fd5 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -7,4 +7,4 @@ requests watchfiles python-multipart xlrd -supertokens-python \ No newline at end of file +supertokens-python==0.29.2 \ No newline at end of file