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: