using Android.App; using Android.OS; using Android.Widget; using Android.Util; using Android.Content; using Android.Views; using System.Text; using System.Threading.Tasks; using Wikitude.Android; using Xamarin.Forms; using Xamarin.Forms.Platform.Android; using Wikitude.Portable; using Xamarin.Forms.Xaml; using Wikitude.Architect; using Wikitude.Common.Camera; using Wikitude.Tools.Device.Features; using Wikitude.Common.Permission; using System; using Android.Support.V4.App; using Android; using Android.Support.Design.Widget; [assembly: ExportRenderer(typeof(ARPage), typeof(ARPageRenderer))] namespace Wikitude.Android { /// /// ARPageRenderer est la partie encapsuler de l'interface IARPage. /// public class ARPageRenderer : PageRenderer { public static ArchitectView architectView; global::Android.Views.View view; Intent wikitudeActivity; Activity activity; ArchitectListener_Droid Listener = (ArchitectListener_Droid)Control_Link.Instance; public static dynamic Object; //PermissionManager permissionManager; /// /// chemin de l'index html du monde à charger pour ARActivity. /// public static string WorldPath; protected override void OnElementChanged(ElementChangedEventArgs e) { base.OnElementChanged(e); var page = e.NewElement as ARPage; WorldPath = page.worldId; activity = this.Context as Activity; view = activity.LayoutInflater.Inflate(Resource.Layout.sample_cam, this, false); AddView(view); } protected override void OnLayout(bool changed, int l, int t, int r, int b) { base.OnLayout(changed, l, t, r, b); var msw = MeasureSpec.MakeMeasureSpec(r - l, MeasureSpecMode.Exactly); var msh = MeasureSpec.MakeMeasureSpec(b - t, MeasureSpecMode.Exactly); view.Measure(msw, msh); view.Layout(0, 0, r - l, b - t); architectView.OnResume(); } protected override void OnAttachedToWindow() { base.OnAttachedToWindow(); if (ActivityCompat.ShouldShowRequestPermissionRationale(activity, Manifest.Permission.Camera)) { // Provide an additional rationale to the user if the permission was not granted // and the user would benefit from additional context for the use of the permission. // For example if the user has previously denied the permission. //Log.Info(TAG, "Displaying camera permission rationale to provide additional context."); Snackbar.Make(this, "", Snackbar.LengthIndefinite).SetAction("", new Action(delegate (global::Android.Views.View obj) { ActivityCompat.RequestPermissions(activity, new String[] { Manifest.Permission.Camera }, 0); })).Show(); } else { // Camera permission has not been granted yet. Request it directly. ActivityCompat.RequestPermissions(activity, new String[] { Manifest.Permission.Camera }, 0); } architectView = view.FindViewById(Resource.Id.architectView); architectView.BuildLayer(); ArchitectStartupConfiguration startupConfiguration = new ArchitectStartupConfiguration(); startupConfiguration.setLicenseKey(Constant.WIKITUDE_SDK_KEY); startupConfiguration.setFeatures(ArchitectStartupConfiguration.Features.ImageTracking); startupConfiguration.setCameraResolution(CameraSettings.CameraResolution.Auto); int requiredFeatures = ArchitectStartupConfiguration.Features.ImageTracking; MissingDeviceFeatures missingDeviceFeatures = ArchitectView.isDeviceSupported(activity, requiredFeatures); if ((ArchitectView.getSupportedFeaturesForDevice(activity.Application) & requiredFeatures) == requiredFeatures) { architectView.OnCreate(startupConfiguration); architectView.AddArchitectJavaScriptInterfaceListener(Listener); } else { architectView = null; if (missingDeviceFeatures != null) { Toast.MakeText(activity, missingDeviceFeatures.getMissingFeatureMessage(), ToastLength.Long).Show(); } } if (architectView != null) { architectView.OnPostCreate(); try { architectView.Load(WorldPath); } catch (Exception ex) { Log.Error("WIKITUDE_PORTABLE", ex.ToString()); } } } //protected override void OnLayout(bool changed, int left, int top, int right, int bottom) //{ // base.OnLayout(changed, left, top, right, bottom); // if (architectView != null) // { // architectView.OnResume(); // } //} protected override void OnDetachedFromWindow() { base.OnDetachedFromWindow(); if (architectView != null) { architectView.OnDestroy(); } } public ARPageRenderer() { } /// /// StartARActivity est une method qui va initialiser l'activité. /// /// World_Path est le chemin de l'index.html pour la réalité augmenter. public void StartARActivity(string _WorldPath) { WorldPath = _WorldPath; } } }