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)
{
Log.Info (TAG, "OnElementChanged");
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)
{
Log.Info (TAG, "OnLayout");
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() {
Log.Info (TAG, "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)
{
Log.Info (TAG, "1");
architectView.OnCreate(startupConfiguration);
architectView.AddArchitectJavaScriptInterfaceListener(Listener);
}
else
{
Log.Info (TAG, "2");
architectView = null;
if (missingDeviceFeatures != null)
{
Log.Info (TAG, "3");
Toast.MakeText(activity, missingDeviceFeatures.getMissingFeatureMessage(), ToastLength.Long).Show();
}
}
if (architectView != null)
{
Log.Info (TAG, "4");
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()
{
Log.Info (TAG, "OnDetachedFromWindow");
base.OnDetachedFromWindow();
if (architectView != null)
{
Log.Info (TAG, "5");
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;
}
}
}