diff --git a/.idea/libraries/Dart_Packages.xml b/.idea/libraries/Dart_Packages.xml index 8cb1ec7..808f7f9 100644 --- a/.idea/libraries/Dart_Packages.xml +++ b/.idea/libraries/Dart_Packages.xml @@ -541,6 +541,13 @@ + + + + + + @@ -961,6 +968,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1066,6 +1108,7 @@ + @@ -1125,6 +1168,11 @@ + + + + + diff --git a/Sources/justMUSIC/android/app/build.gradle b/Sources/justMUSIC/android/app/build.gradle index f318bc7..e0db330 100644 --- a/Sources/justMUSIC/android/app/build.gradle +++ b/Sources/justMUSIC/android/app/build.gradle @@ -75,5 +75,6 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation(platform("com.google.firebase:firebase-bom:32.2.0")) implementation 'com.google.firebase:firebase-analytics-ktx' + implementation 'com.google.android.gms:play-services-ads:22.2.0' } apply plugin: 'com.google.gms.google-services' diff --git a/Sources/justMUSIC/android/app/src/main/AndroidManifest.xml b/Sources/justMUSIC/android/app/src/main/AndroidManifest.xml index 5f9a1bc..f64bdf9 100644 --- a/Sources/justMUSIC/android/app/src/main/AndroidManifest.xml +++ b/Sources/justMUSIC/android/app/src/main/AndroidManifest.xml @@ -31,6 +31,9 @@ package="com.example.justmusic"> + diff --git a/Sources/justMUSIC/android/app/src/main/kotlin/com/example/justmusic/MainActivity.kt b/Sources/justMUSIC/android/app/src/main/kotlin/com/example/justmusic/MainActivity.kt index b8bd3a1..1dc0979 100644 --- a/Sources/justMUSIC/android/app/src/main/kotlin/com/example/justmusic/MainActivity.kt +++ b/Sources/justMUSIC/android/app/src/main/kotlin/com/example/justmusic/MainActivity.kt @@ -1,6 +1,12 @@ package com.example.justmusic - +import android.os.Bundle +import com.google.android.gms.ads.MobileAds import io.flutter.embedding.android.FlutterActivity class MainActivity: FlutterActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + MobileAds.initialize(this) + } + } diff --git a/Sources/justMUSIC/android/build.gradle b/Sources/justMUSIC/android/build.gradle index c0f45cf..21e50ae 100644 --- a/Sources/justMUSIC/android/build.gradle +++ b/Sources/justMUSIC/android/build.gradle @@ -9,6 +9,7 @@ buildscript { classpath 'com.android.tools.build:gradle:7.1.2' classpath 'com.google.gms:google-services:4.3.15' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } } diff --git a/Sources/justMUSIC/lib/ad_helper.dart b/Sources/justMUSIC/lib/ad_helper.dart new file mode 100644 index 0000000..9b42e85 --- /dev/null +++ b/Sources/justMUSIC/lib/ad_helper.dart @@ -0,0 +1,33 @@ +import 'dart:io'; + +class AdHelper { + static String get bannerAdUnitId { + if (Platform.isAndroid) { + return 'ca-app-pub-3940256099942544/6300978111'; + } else if (Platform.isIOS) { + return 'ca-app-pub-3940256099942544/2934735716'; + } else { + throw new UnsupportedError('Unsupported platform'); + } + } + + static String get interstitialAdUnitId { + if (Platform.isAndroid) { + return "ca-app-pub-3940256099942544/1033173712"; + } else if (Platform.isIOS) { + return "ca-app-pub-3940256099942544/4411468910"; + } else { + throw new UnsupportedError("Unsupported platform"); + } + } + + static String get rewardedAdUnitId { + if (Platform.isAndroid) { + return "ca-app-pub-3940256099942544/5224354917"; + } else if (Platform.isIOS) { + return "ca-app-pub-3940256099942544/1712485313"; + } else { + throw new UnsupportedError("Unsupported platform"); + } + } +} diff --git a/Sources/justMUSIC/lib/components/ad_component.dart b/Sources/justMUSIC/lib/components/ad_component.dart new file mode 100644 index 0000000..11c4c99 --- /dev/null +++ b/Sources/justMUSIC/lib/components/ad_component.dart @@ -0,0 +1,61 @@ +import 'package:flutter/Material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:gradient_borders/box_borders/gradient_box_border.dart'; +import 'package:ionicons/ionicons.dart'; +import 'package:justmusic/values/constants.dart'; +import 'package:zoom_tap_animation/zoom_tap_animation.dart'; + +class AdComponent extends StatefulWidget { + final Container ad; + const AdComponent({super.key, required this.ad}); + + @override + State createState() => _AdComponentState(); +} + +class _AdComponentState extends State { + @override + Widget build(BuildContext context) { + return SizedBox( + width: double.infinity, + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + padding: const EdgeInsets.fromLTRB(8, 4, 8, 4), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(1000), + color: grayColor, + ), + child: Row( + children: [ + Icon( + Ionicons.information_circle, + color: grayText.withOpacity(0.4), + size: 15, + ), + SizedBox( + width: 4, + ), + Text( + "Sponsorisé", + style: GoogleFonts.plusJakartaSans( + color: grayText.withOpacity(0.4), fontWeight: FontWeight.w500, fontSize: 12), + ), + ], + )), + ], + ), + SizedBox(height: 10), + widget.ad, + ], + )); + } +} diff --git a/Sources/justMUSIC/lib/main.dart b/Sources/justMUSIC/lib/main.dart index bcba65c..8a1ef96 100644 --- a/Sources/justMUSIC/lib/main.dart +++ b/Sources/justMUSIC/lib/main.dart @@ -3,11 +3,11 @@ import 'package:audioplayers/audioplayers.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_core/firebase_core.dart'; -import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; import 'package:justmusic/screens/add_friend_screen.dart'; import 'package:justmusic/screens/explanations_screen.dart'; import 'package:justmusic/screens/feed_screen.dart'; @@ -28,10 +28,16 @@ import 'package:timezone/data/latest.dart' as tz; Future main() async { tz.initializeTimeZones(); WidgetsFlutterBinding.ensureInitialized(); - await Firebase.initializeApp( - options: DefaultFirebaseOptions.currentPlatform, - ); - await FirebaseMessaging.instance.requestPermission(sound: true); + + try { + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform, + ); + } catch (e) { + print('Error initializing Firebase: $e'); + } + MobileAds.instance.initialize(); + //await FirebaseMessaging.instance.requestPermission(sound: true); runApp(const MyApp()); } @@ -58,7 +64,7 @@ class _MyAppState extends State { @override void initState() { super.initState(); - checkSignIn(); + //checkSignIn(); } Future checkSignIn() async { diff --git a/Sources/justMUSIC/lib/screens/feed_screen.dart b/Sources/justMUSIC/lib/screens/feed_screen.dart index 4382192..cc67451 100644 --- a/Sources/justMUSIC/lib/screens/feed_screen.dart +++ b/Sources/justMUSIC/lib/screens/feed_screen.dart @@ -5,8 +5,11 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:google_mobile_ads/google_mobile_ads.dart'; import 'package:justmusic/main.dart'; import 'package:tuple/tuple.dart'; +import '../ad_helper.dart'; +import '../components/ad_component.dart'; import '../components/post_component.dart'; import '../components/top_nav_bar_component.dart'; import '../model/Post.dart'; @@ -25,19 +28,23 @@ class _FeedScreenState extends State with SingleTickerProviderStateM late Animation animation; late List friendFeed; Timer? timer; + late BannerAd _bannerAd; late List discoveryFeed; late Tuple2, List> displayFeed; bool isDismissed = true; bool choiceFeed = true; PageController controller = PageController(); - + final String AdUnitId = "ca-app-pub-9896583895323467~5308111198"; + bool isBannerAdReady = false; @override void initState() { super.initState(); + friendFeed = MyApp.postViewModel.postsFriends; discoveryFeed = MyApp.postViewModel.bestPosts; + createWidgetAd(); animationController = AnimationController( vsync: this, duration: Duration(milliseconds: 400), @@ -54,6 +61,32 @@ class _FeedScreenState extends State with SingleTickerProviderStateM }); } + createWidgetAd() { + try { + _bannerAd = BannerAd( + size: AdSize.banner, + adUnitId: AdHelper.bannerAdUnitId, + listener: BannerAdListener( + onAdLoaded: (Ad ad) { + setState(() { + isBannerAdReady = true; + }); + }, + onAdFailedToLoad: (Ad ad, LoadAdError error) { + ad.dispose(); + print("error loading ad!"); + }, + onAdOpened: (Ad ad) => print("Ad open!"), + onAdClosed: (Ad ad) => print("Ad closed!"), + onAdImpression: (Ad ad) => print("Ad impressed!"), + ), + request: const AdRequest()); + _bannerAd.load(); + } catch (e) { + print(e); + } + } + @override void dispose() { controller.dispose(); @@ -120,6 +153,15 @@ class _FeedScreenState extends State with SingleTickerProviderStateM Tuple2(MyApp.postViewModel.postsFriends.reversed.toList(), MyApp.postViewModel.bestPosts.reversed.toList()); bool empty = (choiceFeed == true && displayFeed.item1.isEmpty) || (choiceFeed == false && displayFeed.item2.isEmpty); + + final AdWidget adWidget = AdWidget(ad: _bannerAd); + final Container adContainer = Container( + alignment: Alignment.center, + width: _bannerAd.size.width.toDouble(), + height: _bannerAd.size.height.toDouble(), + child: adWidget, + ); + return Scaffold( resizeToAvoidBottomInset: false, backgroundColor: bgColor, @@ -204,7 +246,7 @@ class _FeedScreenState extends State with SingleTickerProviderStateM displacement: 20, triggerMode: RefreshIndicatorTriggerMode.onEdge, onRefresh: _refresh, - child: ListView.builder( + child: ListView.separated( physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()), clipBehavior: Clip.none, shrinkWrap: false, @@ -216,6 +258,16 @@ class _FeedScreenState extends State with SingleTickerProviderStateM PostComponent(callback: openDetailPost, post: displayFeed.item2[index], index: index), ); }, + separatorBuilder: (BuildContext context, int index) { + print("separator"); + return isBannerAdReady + ? Padding( + padding: const EdgeInsets.only(bottom: 40), + child: AdComponent( + ad: adContainer, + )) + : Container(); + }, ), ), ), diff --git a/Sources/justMUSIC/pubspec.lock b/Sources/justMUSIC/pubspec.lock index ef6e363..54d8a5c 100644 --- a/Sources/justMUSIC/pubspec.lock +++ b/Sources/justMUSIC/pubspec.lock @@ -608,6 +608,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.4" + google_mobile_ads: + dependency: "direct main" + description: + name: google_mobile_ads + sha256: "24ee4e9546866cc15ebe565dabf6a6c485ce5fbec0645fde22799800532000f0" + url: "https://pub.dev" + source: hosted + version: "3.0.0" gradiantbutton: dependency: "direct main" description: @@ -1085,6 +1093,46 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + visibility_detector: + dependency: transitive + description: + name: visibility_detector + sha256: "15c54a459ec2c17b4705450483f3d5a2858e733aee893dcee9d75fd04814940d" + url: "https://pub.dev" + source: hosted + version: "0.3.3" + webview_flutter: + dependency: transitive + description: + name: webview_flutter + sha256: "789d52bd789373cc1e100fb634af2127e86c99cf9abde09499743270c5de8d00" + url: "https://pub.dev" + source: hosted + version: "4.2.2" + webview_flutter_android: + dependency: transitive + description: + name: webview_flutter_android + sha256: d936a09fbfd08cb78f7329e0bbacf6158fbdfe24ffc908b22444c07d295eb193 + url: "https://pub.dev" + source: hosted + version: "3.9.2" + webview_flutter_platform_interface: + dependency: transitive + description: + name: webview_flutter_platform_interface + sha256: "564ef378cafc1a0e29f1d76ce175ef517a0a6115875dff7b43fccbef2b0aeb30" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + webview_flutter_wkwebview: + dependency: transitive + description: + name: webview_flutter_wkwebview + sha256: "5fa098f28b606f699e8ca52d9e4e11edbbfef65189f5f77ae92703ba5408fd25" + url: "https://pub.dev" + source: hosted + version: "3.7.2" win32: dependency: transitive description: diff --git a/Sources/justMUSIC/pubspec.yaml b/Sources/justMUSIC/pubspec.yaml index 872339f..6113bfd 100644 --- a/Sources/justMUSIC/pubspec.yaml +++ b/Sources/justMUSIC/pubspec.yaml @@ -75,6 +75,7 @@ dependencies: timezone: ^0.9.2 firebase_messaging: ^14.6.5 cached_network_image: ^3.2.3 + google_mobile_ads: ^3.0.0 dev_dependencies: flutter_test: