From 9f12670130807e0d793f28a378f7758b0716ed61 Mon Sep 17 00:00:00 2001 From: Srihari Vishnu Date: Sun, 18 Oct 2020 23:54:16 -0400 Subject: [PATCH] add ads --- app/build.gradle | 3 + app/src/main/AndroidManifest.xml | 3 + .../magnitudestudios/GameFace/Constants.kt | 1 + .../pojo/VideoCall/StartGameRequest.kt | 15 +++ .../GameFace/repository/SessionRepository.kt | 39 ++++++- .../GameFace/ui/camera/CallFinished.kt | 74 ++++++++++++ .../GameFace/ui/camera/CameraFragment.kt | 20 ++-- .../GameFace/ui/camera/CameraViewModel.kt | 21 ++++ .../GameFace/ui/main/MainActivity.kt | 2 + .../GameFace/ui/shop/ShopFragment.kt | 6 +- .../GameFace/ui/shop/tabs/EarnFragment.kt | 105 +++++++++++++++++ .../GameFace/views/VideoLayout.kt | 1 - .../res/layout/fragment_call_finished.xml | 108 ++++++++++++++++++ app/src/main/res/layout/fragment_earn.xml | 41 +++++++ .../main/res/navigation/main_nav_graph.xml | 10 ++ app/src/main/res/values/strings.xml | 8 ++ 16 files changed, 442 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/com/magnitudestudios/GameFace/pojo/VideoCall/StartGameRequest.kt create mode 100644 app/src/main/java/com/magnitudestudios/GameFace/ui/camera/CallFinished.kt create mode 100644 app/src/main/java/com/magnitudestudios/GameFace/ui/shop/tabs/EarnFragment.kt create mode 100644 app/src/main/res/layout/fragment_call_finished.xml create mode 100644 app/src/main/res/layout/fragment_earn.xml diff --git a/app/build.gradle b/app/build.gradle index f05c5ee..607a481 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -86,6 +86,8 @@ dependencies { androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + implementation 'com.google.android.gms:play-services-ads:19.3.0' + implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version" implementation "androidx.navigation:navigation-ui-ktx:$navigation_version" implementation "androidx.core:core-ktx:1.3.1" @@ -108,6 +110,7 @@ dependencies { implementation "androidx.dynamicanimation:dynamicanimation-ktx:1.0.0-alpha03" + debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.4' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0e605a5..3bb7650 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,6 +24,9 @@ android:supportsRtl="true" android:hardwareAccelerated="true" android:theme="@style/AppTheme"> + diff --git a/app/src/main/java/com/magnitudestudios/GameFace/Constants.kt b/app/src/main/java/com/magnitudestudios/GameFace/Constants.kt index cd7af86..dd8732a 100644 --- a/app/src/main/java/com/magnitudestudios/GameFace/Constants.kt +++ b/app/src/main/java/com/magnitudestudios/GameFace/Constants.kt @@ -27,6 +27,7 @@ object Constants { const val CONNECT_PATH = "connection" const val PROFILE_PATH = "profiles" const val MEMBERS_PATH = "members" + const val GAMES_PATH = "games" const val CHARADES_PATH = "charades" const val WOULD_YOU_RATHER_PATH = "would_you_rather" diff --git a/app/src/main/java/com/magnitudestudios/GameFace/pojo/VideoCall/StartGameRequest.kt b/app/src/main/java/com/magnitudestudios/GameFace/pojo/VideoCall/StartGameRequest.kt new file mode 100644 index 0000000..ba99df1 --- /dev/null +++ b/app/src/main/java/com/magnitudestudios/GameFace/pojo/VideoCall/StartGameRequest.kt @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2020 - Magnitude Studios - All Rights Reserved + * Unauthorized copying of this file, via any medium is prohibited + * All software is proprietary and confidential + * + */ + +package com.magnitudestudios.GameFace.pojo.VideoCall + +data class StartGameRequest( + val gameID : String = "", + val version : Int = 0, + val name : String = "", + val senderUID : String = "" +) \ No newline at end of file diff --git a/app/src/main/java/com/magnitudestudios/GameFace/repository/SessionRepository.kt b/app/src/main/java/com/magnitudestudios/GameFace/repository/SessionRepository.kt index 938fcd9..c303006 100644 --- a/app/src/main/java/com/magnitudestudios/GameFace/repository/SessionRepository.kt +++ b/app/src/main/java/com/magnitudestudios/GameFace/repository/SessionRepository.kt @@ -9,6 +9,8 @@ package com.magnitudestudios.GameFace.repository import android.content.Context import android.util.Log +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import androidx.work.CoroutineWorker import androidx.work.ListenableWorker import androidx.work.Worker @@ -28,10 +30,7 @@ import com.magnitudestudios.GameFace.callbacks.RoomCallback import com.magnitudestudios.GameFace.doOnChildAdded import com.magnitudestudios.GameFace.pojo.EnumClasses.MemberStatus import com.magnitudestudios.GameFace.pojo.Helper.Resource -import com.magnitudestudios.GameFace.pojo.VideoCall.EmitMessage -import com.magnitudestudios.GameFace.pojo.VideoCall.IceCandidatePOJO -import com.magnitudestudios.GameFace.pojo.VideoCall.Member -import com.magnitudestudios.GameFace.pojo.VideoCall.SessionInfoPOJO +import com.magnitudestudios.GameFace.pojo.VideoCall.* import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow @@ -208,4 +207,36 @@ object SessionRepository { } } + /** + * Game Server Operations + */ + fun introduceGame(req: StartGameRequest) { + Firebase.database.reference + .child(Constants.ROOMS_PATH) + .child(currentRoom!!) + .child(Constants.GAMES_PATH) + .push() + .setValue(req) + } + + fun joinGame(gameID : String) { + Firebase.database.reference + .child(Constants.ROOMS_PATH) + .child(currentRoom!!) + .child(gameID) + .push() + .setValue({Constants.JOINED_KEY to Firebase.auth.currentUser!!.uid}) + } + + fun listenForNewGames() : LiveData { + val live = MutableLiveData() + Firebase.database.reference.child(Constants.ROOMS_PATH).child(currentRoom!!).child(Constants.GAMES_PATH).doOnChildAdded { + val data = it.getValue(StartGameRequest::class.java) + if (data != null && data.senderUID != Firebase.auth.currentUser!!.uid) { + live.postValue(data!!) + } + } + return live + } + } \ No newline at end of file diff --git a/app/src/main/java/com/magnitudestudios/GameFace/ui/camera/CallFinished.kt b/app/src/main/java/com/magnitudestudios/GameFace/ui/camera/CallFinished.kt new file mode 100644 index 0000000..3696501 --- /dev/null +++ b/app/src/main/java/com/magnitudestudios/GameFace/ui/camera/CallFinished.kt @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2020 - Magnitude Studios - All Rights Reserved + * Unauthorized copying of this file, via any medium is prohibited + * All software is proprietary and confidential + * + */ + +package com.magnitudestudios.GameFace.ui.camera + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.activity.OnBackPressedCallback +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.navigation.fragment.findNavController +import androidx.navigation.navGraphViewModels +import com.bumptech.glide.Glide +import com.google.android.gms.ads.AdRequest +import com.google.android.gms.ads.InterstitialAd +import com.magnitudestudios.GameFace.R +import com.magnitudestudios.GameFace.bases.BaseFragment +import com.magnitudestudios.GameFace.databinding.FragmentCallFinishedBinding +import com.magnitudestudios.GameFace.loadProfile +import com.magnitudestudios.GameFace.ui.main.MainViewModel + +class CallFinished : BaseFragment() { + lateinit var bind: FragmentCallFinishedBinding + private val viewModel: CameraViewModel by navGraphViewModels(R.id.videoCallGraph) + private lateinit var mainViewModel : MainViewModel + private lateinit var mInterstitialAd: InterstitialAd + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + bind = FragmentCallFinishedBinding.inflate(inflater, container, false) + mainViewModel = requireActivity().run { ViewModelProvider(this).get(MainViewModel::class.java) }!! + mInterstitialAd = InterstitialAd(requireContext()) + mInterstitialAd.adUnitId = getString(R.string.interstitial_after_calling) + mInterstitialAd.loadAd(AdRequest.Builder().build()) + + val callback: OnBackPressedCallback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + goToHome() + } + } + requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback) + return bind.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val adRequest = AdRequest.Builder().build() + bind.bannerAfterCall.loadAd(adRequest) + mInterstitialAd.show() + + viewModel.members.observe(viewLifecycleOwner, Observer { mutableList -> + if (mutableList.isNullOrEmpty()) { + bind.membersNames.text = mainViewModel.profile.value?.data?.username + Glide.with(this).loadProfile(mainViewModel.profile.value?.data?.profilePic, bind.profilePic) + } + else { + bind.membersNames.text = mutableList.mapNotNull { it.profile?.username }.joinToString(", ") + Glide.with(this).loadProfile(mutableList[0].profile?.profilePic, bind.profilePic) + } + }) + + bind.goHome.setOnClickListener { + goToHome() + } + } + private fun goToHome() { + findNavController().popBackStack(R.id.bottomContainerFragment, false) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/magnitudestudios/GameFace/ui/camera/CameraFragment.kt b/app/src/main/java/com/magnitudestudios/GameFace/ui/camera/CameraFragment.kt index 466861f..55e4af3 100644 --- a/app/src/main/java/com/magnitudestudios/GameFace/ui/camera/CameraFragment.kt +++ b/app/src/main/java/com/magnitudestudios/GameFace/ui/camera/CameraFragment.kt @@ -17,6 +17,7 @@ import android.view.ViewGroup import android.view.WindowManager import android.widget.FrameLayout import android.widget.Toast +import androidx.activity.OnBackPressedCallback import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope @@ -38,6 +39,7 @@ import kotlinx.coroutines.launch import org.webrtc.* import java.util.concurrent.ConcurrentHashMap + class CameraFragment : BaseFragment(), View.OnClickListener { private lateinit var peerConnectionFactory: PeerConnectionFactory private var videoCapturer: VideoCapturer? = null @@ -75,6 +77,11 @@ class CameraFragment : BaseFragment(), View.OnClickListener { ViewModelProvider(this).get(MainViewModel::class.java) }!! rootEglBase = EglBase.create() + + val callback: OnBackPressedCallback = object : OnBackPressedCallback(true /* enabled by default */) { + override fun handleOnBackPressed() {} + } + requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, callback) return bind.root } @@ -82,7 +89,7 @@ class CameraFragment : BaseFragment(), View.OnClickListener { super.onViewCreated(view, savedInstanceState) requireActivity().window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); - bind.localVideo.initialize(eglBase = rootEglBase, overlay = true, onTop = true) + bind.localVideo.initialize(eglBase = rootEglBase, overlay = true, onTop = false) audioManager = context?.getSystemService(Context.AUDIO_SERVICE) as AudioManager audioManager.isSpeakerphoneOn = true @@ -102,7 +109,7 @@ class CameraFragment : BaseFragment(), View.OnClickListener { bind.callingControls.animate().setDuration(5000).alpha(0f) } } - bind.callingControls.setOnClickListener {Log.e("CLICKED","CLICKED")} + bind.callingControls.setOnClickListener {Log.e("CLICKED", "CLICKED")} bind.addMember.setOnClickListener { findNavController().navigate(R.id.action_cameraFragment_to_addMembersDialog) @@ -133,7 +140,7 @@ class CameraFragment : BaseFragment(), View.OnClickListener { private fun observeConnection() { viewModel.connectionStatus.observe(viewLifecycleOwner, Observer { - when(it.status) { + when (it.status) { Status.ERROR -> connectionFailed(it.message) Status.LOADING -> setLoading(true) else -> setLoading(false) @@ -171,8 +178,7 @@ class CameraFragment : BaseFragment(), View.OnClickListener { if (it != null) { if (args.roomID.isNotEmpty()) { viewModel.joinRoom(args.roomID) - } - else if (args.callUserUID.isNotEmpty()) { + } else if (args.callUserUID.isNotEmpty()) { viewModel.createRoom(args.callUserUID) } } @@ -315,7 +321,7 @@ class CameraFragment : BaseFragment(), View.OnClickListener { } - private fun gotPeerStream(peerUID: String, stream: MediaStream ) { + private fun gotPeerStream(peerUID: String, stream: MediaStream) { Log.e(TAG, "gotRemoteStream: " + "GOT REMOTE STREAM") //we have remote video stream. add to the renderer. activity?.runOnUiThread { @@ -377,7 +383,7 @@ class CameraFragment : BaseFragment(), View.OnClickListener { e.printStackTrace() } if (userDefined) { - findNavController().popBackStack() + findNavController().navigate(R.id.action_cameraFragment_to_callFinished) } } diff --git a/app/src/main/java/com/magnitudestudios/GameFace/ui/camera/CameraViewModel.kt b/app/src/main/java/com/magnitudestudios/GameFace/ui/camera/CameraViewModel.kt index c93c78b..39bea3f 100644 --- a/app/src/main/java/com/magnitudestudios/GameFace/ui/camera/CameraViewModel.kt +++ b/app/src/main/java/com/magnitudestudios/GameFace/ui/camera/CameraViewModel.kt @@ -14,6 +14,8 @@ import androidx.lifecycle.* import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager import androidx.work.workDataOf +import com.google.firebase.auth.FirebaseAuth +import com.google.firebase.auth.ktx.FirebaseAuthKtxRegistrar import com.google.firebase.auth.ktx.auth import com.google.firebase.ktx.Firebase import com.google.gson.Gson @@ -27,6 +29,7 @@ import com.magnitudestudios.GameFace.notifyObserver import com.magnitudestudios.GameFace.pojo.EnumClasses.MemberStatus import com.magnitudestudios.GameFace.pojo.EnumClasses.Status import com.magnitudestudios.GameFace.pojo.Helper.Resource +import com.magnitudestudios.GameFace.pojo.UserInfo.LocalPackInfo import com.magnitudestudios.GameFace.pojo.VideoCall.* import com.magnitudestudios.GameFace.repository.SessionRepository import com.magnitudestudios.GameFace.repository.UserRepository @@ -81,6 +84,8 @@ class CameraViewModel(application: Application) : AndroidViewModel(application), emit(tempIceServers) } + val newGame = MutableLiveData() + fun addPeer(uid: String, peer: PeerConnection) { if (!connections.value!!.containsKey(uid)) { connections.value?.put(uid, peer) @@ -227,4 +232,20 @@ class CameraViewModel(application: Application) : AndroidViewModel(application), } + /** + * Game Functions + */ + + fun sendGameRequest(req : LocalPackInfo) { + SessionRepository.introduceGame(StartGameRequest(req.id, req.version, req.name, Firebase.auth.currentUser!!.uid)) + } + + fun onNewGame(startGameRequest: StartGameRequest) { + newGame.value = startGameRequest + } + + fun joinGame(gameID : String) { + + } + } \ No newline at end of file diff --git a/app/src/main/java/com/magnitudestudios/GameFace/ui/main/MainActivity.kt b/app/src/main/java/com/magnitudestudios/GameFace/ui/main/MainActivity.kt index 687a2b0..0ab418d 100644 --- a/app/src/main/java/com/magnitudestudios/GameFace/ui/main/MainActivity.kt +++ b/app/src/main/java/com/magnitudestudios/GameFace/ui/main/MainActivity.kt @@ -17,6 +17,7 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.navigation.NavDestination import androidx.navigation.findNavController +import com.google.android.gms.ads.MobileAds import com.magnitudestudios.GameFace.Constants import com.magnitudestudios.GameFace.R import com.magnitudestudios.GameFace.bases.BasePermissionsActivity @@ -32,6 +33,7 @@ class MainActivity : BasePermissionsActivity() { private lateinit var viewModel: MainViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + MobileAds.initialize(this) {} binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) viewModel = ViewModelProvider(this)[MainViewModel::class.java] diff --git a/app/src/main/java/com/magnitudestudios/GameFace/ui/shop/ShopFragment.kt b/app/src/main/java/com/magnitudestudios/GameFace/ui/shop/ShopFragment.kt index 3c96010..f156aa5 100644 --- a/app/src/main/java/com/magnitudestudios/GameFace/ui/shop/ShopFragment.kt +++ b/app/src/main/java/com/magnitudestudios/GameFace/ui/shop/ShopFragment.kt @@ -27,6 +27,7 @@ import com.magnitudestudios.GameFace.callbacks.RVButtonClick import com.magnitudestudios.GameFace.databinding.FragmentShopBinding import com.magnitudestudios.GameFace.databinding.ItemShowcaseBinding import com.magnitudestudios.GameFace.ui.BottomContainerFragmentDirections +import com.magnitudestudios.GameFace.ui.shop.tabs.EarnFragment import com.magnitudestudios.GameFace.ui.shop.tabs.InstalledFragment import com.magnitudestudios.GameFace.ui.shop.tabs.MarketFragment import com.magnitudestudios.GameFace.views.ShowCaseItemViewHolder @@ -98,9 +99,8 @@ class ShopFragment : BaseFragment() { val fragment = when (position) { 0 -> MarketFragment() 1 -> InstalledFragment() -// 1 -> FriendsFragment() -// 2 -> FriendRequestsFragment() - else -> MarketFragment() + 2 -> EarnFragment() + else -> throw IllegalStateException("Unknown Fragment Position: $position") } childFragmentManager.beginTransaction().replace(R.id.shopContainer, fragment).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).commit() } diff --git a/app/src/main/java/com/magnitudestudios/GameFace/ui/shop/tabs/EarnFragment.kt b/app/src/main/java/com/magnitudestudios/GameFace/ui/shop/tabs/EarnFragment.kt new file mode 100644 index 0000000..64dc1a7 --- /dev/null +++ b/app/src/main/java/com/magnitudestudios/GameFace/ui/shop/tabs/EarnFragment.kt @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2020 - Magnitude Studios - All Rights Reserved + * Unauthorized copying of this file, via any medium is prohibited + * All software is proprietary and confidential + * + */ + +package com.magnitudestudios.GameFace.ui.shop.tabs + +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import com.google.android.gms.ads.AdError +import com.google.android.gms.ads.AdRequest +import com.google.android.gms.ads.LoadAdError +import com.google.android.gms.ads.reward.RewardItem +import com.google.android.gms.ads.reward.RewardedVideoAdListener +import com.google.android.gms.ads.rewarded.RewardedAd +import com.google.android.gms.ads.rewarded.RewardedAdCallback +import com.google.android.gms.ads.rewarded.RewardedAdLoadCallback +import com.magnitudestudios.GameFace.R +import com.magnitudestudios.GameFace.bases.BaseFragment +import com.magnitudestudios.GameFace.databinding.FragmentEarnBinding + +class EarnFragment : BaseFragment(), RewardedVideoAdListener { + lateinit var bind : FragmentEarnBinding + private lateinit var rewardedAd: RewardedAd + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + bind = FragmentEarnBinding.inflate(inflater, container, false) + rewardedAd = RewardedAd(requireActivity(), getString(R.string.rewarded_earn)) + bind.watchAd.isEnabled = false + loadRewardedVideoAd() + return bind.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + bind.watchAd.setOnClickListener { + if (rewardedAd.isLoaded) { + val activityContext = requireActivity() + val adCallback = object: RewardedAdCallback() { + override fun onRewardedAdOpened() {} + override fun onRewardedAdClosed() {} + + override fun onUserEarnedReward(p0: com.google.android.gms.ads.rewarded.RewardItem) { + Toast.makeText(requireContext(), "You have earned ${p0.amount} GamePoints!", Toast.LENGTH_LONG).show() + } + + override fun onRewardedAdFailedToShow(adError: AdError) { + Toast.makeText(requireContext(), "Ad has failed to load! Please try again later!", Toast.LENGTH_LONG).show() + } + } + rewardedAd.show(activityContext, adCallback) + } + else { + Toast.makeText(requireContext(), "Please wait a second!", Toast.LENGTH_LONG).show() + Log.d("TAG", "The rewarded ad wasn't loaded yet.") + } + } + + } + + private fun loadRewardedVideoAd() { + val adLoadCallback = object: RewardedAdLoadCallback() { + override fun onRewardedAdLoaded() { + bind.watchAd.isEnabled = true + } + override fun onRewardedAdFailedToLoad(adError: LoadAdError) { + bind.watchAd.isEnabled = false + Log.e("EarnFragment", "Ad Failed to Load ${adError.message}") + Toast.makeText(requireContext(), adError.message, Toast.LENGTH_LONG).show() + } + } + rewardedAd.loadAd(AdRequest.Builder().build(), adLoadCallback) + } + + override fun onRewardedVideoAdLoaded() {} + + override fun onRewardedVideoAdOpened() {} + + override fun onRewardedVideoStarted() {} + + override fun onRewardedVideoAdClosed() { + loadRewardedVideoAd() + } + + override fun onRewarded(p0: RewardItem?) { + + } + + override fun onRewardedVideoAdLeftApplication() {} + + override fun onRewardedVideoAdFailedToLoad(p0: Int) { + Toast.makeText(requireContext(), "Ad Failed to load. Please try again later!", Toast.LENGTH_LONG).show() + } + + override fun onRewardedVideoCompleted() { + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/magnitudestudios/GameFace/views/VideoLayout.kt b/app/src/main/java/com/magnitudestudios/GameFace/views/VideoLayout.kt index 270389b..a5859f6 100644 --- a/app/src/main/java/com/magnitudestudios/GameFace/views/VideoLayout.kt +++ b/app/src/main/java/com/magnitudestudios/GameFace/views/VideoLayout.kt @@ -115,7 +115,6 @@ class VideoLayout @JvmOverloads constructor( } override fun onTouchEvent(event: MotionEvent?): Boolean { - return super.onTouchEvent(event) } diff --git a/app/src/main/res/layout/fragment_call_finished.xml b/app/src/main/res/layout/fragment_call_finished.xml new file mode 100644 index 0000000..9c8e6e6 --- /dev/null +++ b/app/src/main/res/layout/fragment_call_finished.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_earn.xml b/app/src/main/res/layout/fragment_earn.xml new file mode 100644 index 0000000..bd44d92 --- /dev/null +++ b/app/src/main/res/layout/fragment_earn.xml @@ -0,0 +1,41 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/main_nav_graph.xml b/app/src/main/res/navigation/main_nav_graph.xml index 08b6619..55375c0 100644 --- a/app/src/main/res/navigation/main_nav_graph.xml +++ b/app/src/main/res/navigation/main_nav_graph.xml @@ -142,12 +142,22 @@ + + https://www.gamefacechat.com/ https://www.gamefacechat.com/about-us + + ca-app-pub-3940256099942544/1033173712 + ca-app-pub-3940256099942544/6300978111 + ca-app-pub-3940256099942544/6300978111 + ca-app-pub-3940256099942544/5224354917 GameFace GameFace @@ -134,6 +139,9 @@ Packs Games Won 0 + Call Ended + Watch Ad (+25) + Go to Home