using System; using Android.App; using Android.Content; using Android.Content.PM; using Android.Gms.Ads; using Android.Gms.Common; using Android.Gms.Games; using Android.OS; using Android.Views; using Android.Widget; using Microsoft.Xna.Framework; using MLEM.Extensions; using MLEM.Misc; using TouchyTickets; using static Android.Views.SystemUiFlags; using static Android.Views.ViewGroup.LayoutParams; using Uri = Android.Net.Uri; namespace Android { [Activity( Label = "@string/app_name", MainLauncher = true, Icon = "@drawable/icon", AlwaysRetainTaskState = true, LaunchMode = LaunchMode.SingleInstance, ScreenOrientation = ScreenOrientation.UserPortrait, ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden | ConfigChanges.ScreenSize )] public class Activity1 : AndroidGameActivity { private GameImpl game; private AndroidPlatform platform; private LinearLayout mainView; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // ad layout var adLayout = new LinearLayout(this) {Orientation = Orientation.Vertical}; adLayout.SetGravity(GravityFlags.Bottom); // set up the game TextInputWrapper.Current = new TextInputWrapper.Mobile(); this.platform = new AndroidPlatform(this, adLayout); this.game = new GameImpl(this.platform); this.game.GraphicsDeviceManager.ResetWidthAndHeight(this.game.Window); this.game.GraphicsDeviceManager.IsFullScreen = true; this.game.OnLoadContent += game => { game.InputHandler.HandleMouse = false; game.UiSystem.LinkBehavior = l => this.StartActivity(new Intent(Intent.ActionView, Uri.Parse(l.Match.Groups[1].Value))); }; var gameView = this.game.Services.GetService(typeof(View)) as View; gameView.LayoutChange += (o, args) => { // force the game size to update when the ad size changes this.game.GraphicsDeviceManager.PreferredBackBufferWidth = args.Right - args.Left; this.game.GraphicsDeviceManager.PreferredBackBufferHeight = args.Bottom - args.Top; this.game.GraphicsDeviceManager.ApplyChanges(); }; // don't render under notches if (Build.VERSION.SdkInt >= BuildVersionCodes.P) this.Window.Attributes.LayoutInDisplayCutoutMode = LayoutInDisplayCutoutMode.Never; // total layout that is displayed this.mainView = new LinearLayout(this) {Orientation = Orientation.Vertical}; this.mainView.LayoutParameters = new LinearLayout.LayoutParams(MatchParent, MatchParent); this.mainView.AddView(gameView); // height of 0 but high weight causes this element so scale based on the ad's height gameView.LayoutParameters = new LinearLayout.LayoutParams(MatchParent, 0, 1); this.mainView.AddView(adLayout); adLayout.LayoutParameters = new LinearLayout.LayoutParams(MatchParent, WrapContent); this.SetContentView(this.mainView); this.game.Run(); } protected override void OnActivityResult(int requestCode, Result result, Intent data) { base.OnActivityResult(requestCode, result, data); // Connect again after logging in to Google Play game services, but only if we haven't tried yet if (requestCode == AndroidPlatform.GooglePlayLoginRequest && (int) result != GamesActivityResultCodes.ResultSignInFailed) this.platform.GoogleApi.Connect(); } public override void OnWindowFocusChanged(bool hasFocus) { base.OnWindowFocusChanged(hasFocus); // hide the status bar if (hasFocus) this.Window.DecorView.SystemUiVisibility = (StatusBarVisibility) (ImmersiveSticky | LayoutStable | LayoutHideNavigation | LayoutFullscreen | HideNavigation | Fullscreen); } } }