From 68d002750df056b26cea621da7cc7703ca1d0bc5 Mon Sep 17 00:00:00 2001 From: Miguel de Icaza Date: Sat, 27 Aug 2011 21:22:12 -0400 Subject: [PATCH] Add AdJitsu bindings --- AdJitsu/AdJitsu.csproj | 105 ++++++++++++++++ AdJitsu/AdJitsu.sln | 26 ++++ AdJitsu/Info.plist | 13 ++ AdJitsu/Main.cs | 36 ++++++ AdJitsu/MainWindow.xib | 184 +++++++++++++++++++++++++++++ AdJitsu/MainWindow.xib.designer.cs | 33 ++++++ AdJitsu/Makefile | 7 ++ AdJitsu/README.md | 45 +++++++ AdJitsu/SampleAdjitsu.cs | 108 +++++++++++++++++ AdJitsu/adjitsu.cs | 67 +++++++++++ AdJitsu/adjitsu.dll | Bin 0 -> 11776 bytes 11 files changed, 624 insertions(+) create mode 100644 AdJitsu/AdJitsu.csproj create mode 100644 AdJitsu/AdJitsu.sln create mode 100644 AdJitsu/Info.plist create mode 100644 AdJitsu/Main.cs create mode 100644 AdJitsu/MainWindow.xib create mode 100644 AdJitsu/MainWindow.xib.designer.cs create mode 100644 AdJitsu/Makefile create mode 100644 AdJitsu/README.md create mode 100644 AdJitsu/SampleAdjitsu.cs create mode 100644 AdJitsu/adjitsu.cs create mode 100755 AdJitsu/adjitsu.dll diff --git a/AdJitsu/AdJitsu.csproj b/AdJitsu/AdJitsu.csproj new file mode 100644 index 00000000..2ec0afab --- /dev/null +++ b/AdJitsu/AdJitsu.csproj @@ -0,0 +1,105 @@ + + + + Debug + iPhoneSimulator + 9.0.21022 + 2.0 + {8C58D49B-87A9-4393-A055-A22D09B4F72B} + {E613F3A2-FE9C-494F-B74E-F63BCB86FEA6};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Exe + AdJitsu + MainWindow.xib + AdJitsu + 3.0 + v1.0 + + + true + full + false + bin\iPhoneSimulator\Debug + DEBUG + prompt + 4 + None + True + false + false + false + false + ARMv6 + --cxx --gcc_flags "-framework QuartzCore -framework CoreGraphics -framework AVFoundation -framework CoreLocation -framework CoreMedia -framework CoreMotion -framework CoreText -framework MediaPlayer -framework MobileCoreServices -framework OpenGLES -framework QuartzCore -L${ProjectDir} -lAdJitsuSDK -force_load ${ProjectDir}/libAdJitsuSDK.a -lxml2 -lsqlite3" + + + + none + false + bin\iPhoneSimulator\Release + prompt + 4 + None + False + false + false + false + false + ARMv6 + + + true + full + false + bin\iPhone\Debug + DEBUG + prompt + 4 + false + True + iPhone Developer + false + false + ARMv6 + false + --armv7 --cxx --gcc_flags "-framework AVFoundation -framework CoreLocation -framework CoreMedia -framework CoreMotion -framework CoreText -framework MediaPlayer -framework MobileCoreServices -framework OpenGLES -framework QuartzCore -L${ProjectDir} -lAdJitsuSDK -force_load ${ProjectDir}/libAdJitsuSDK.a -lxml2 -lsqlite3 -framework CoreGraphics -framework QuartzCore" + + + + none + false + bin\iPhone\Release + prompt + 4 + false + False + false + false + iPhone Developer + ARMv6 + false + + + + + + + + False + adjitsu.dll + + + + + + + + MainWindow.xib + + + + + + + + + \ No newline at end of file diff --git a/AdJitsu/AdJitsu.sln b/AdJitsu/AdJitsu.sln new file mode 100644 index 00000000..0d131349 --- /dev/null +++ b/AdJitsu/AdJitsu.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdJitsu", "AdJitsu.csproj", "{8C58D49B-87A9-4393-A055-A22D09B4F72B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|iPhoneSimulator = Debug|iPhoneSimulator + Release|iPhoneSimulator = Release|iPhoneSimulator + Debug|iPhone = Debug|iPhone + Release|iPhone = Release|iPhone + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8C58D49B-87A9-4393-A055-A22D09B4F72B}.Debug|iPhone.ActiveCfg = Debug|iPhone + {8C58D49B-87A9-4393-A055-A22D09B4F72B}.Debug|iPhone.Build.0 = Debug|iPhone + {8C58D49B-87A9-4393-A055-A22D09B4F72B}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator + {8C58D49B-87A9-4393-A055-A22D09B4F72B}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator + {8C58D49B-87A9-4393-A055-A22D09B4F72B}.Release|iPhone.ActiveCfg = Release|iPhone + {8C58D49B-87A9-4393-A055-A22D09B4F72B}.Release|iPhone.Build.0 = Release|iPhone + {8C58D49B-87A9-4393-A055-A22D09B4F72B}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator + {8C58D49B-87A9-4393-A055-A22D09B4F72B}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator + EndGlobalSection + GlobalSection(MonoDevelopProperties) = preSolution + StartupItem = AdJitsu.csproj + EndGlobalSection +EndGlobal diff --git a/AdJitsu/Info.plist b/AdJitsu/Info.plist new file mode 100644 index 00000000..c6e9d7aa --- /dev/null +++ b/AdJitsu/Info.plist @@ -0,0 +1,13 @@ + + + + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + \ No newline at end of file diff --git a/AdJitsu/Main.cs b/AdJitsu/Main.cs new file mode 100644 index 00000000..5a6a1212 --- /dev/null +++ b/AdJitsu/Main.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using MonoTouch.Foundation; +using MonoTouch.UIKit; + +namespace AdJitsu +{ + public class Application + { + static void Main (string[] args) + { + UIApplication.Main (args); + } + } + + public partial class AppDelegate : UIApplicationDelegate + { + SampleAdjitsu sample; + + public override bool FinishedLaunching (UIApplication app, NSDictionary options) + { + sample = new SampleAdjitsu (); + + window.Add (sample.View); + window.MakeKeyAndVisible (); + + return true; + } + + public override void OnActivated (UIApplication application) + { + } + } +} + diff --git a/AdJitsu/MainWindow.xib b/AdJitsu/MainWindow.xib new file mode 100644 index 00000000..83a288f4 --- /dev/null +++ b/AdJitsu/MainWindow.xib @@ -0,0 +1,184 @@ + + + + 768 + 9J61 + 677 + 949.46 + 353.00 + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + + + IBFirstResponder + + + + + 1316 + + {320, 480} + + + 1 + MSAxIDEAA + + NO + NO + + + + + + YES + + + delegate + + + + 5 + + + + window + + + + 7 + + + + + YES + + 0 + + YES + + + + + + 2 + + + YES + + + + + -1 + + + RmlsZSdzIE93bmVyA + + + 4 + + + App Delegate + + + -2 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 2.IBAttributePlaceholdersKey + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 2.UIWindow.visibleAtLaunch + 4.CustomClassName + 4.IBPluginDependency + + + YES + UIApplication + UIResponder + + YES + + YES + + + YES + + + {{593, 276}, {320, 480}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AppDelegate + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + YES + + + YES + + + + + YES + + YES + + + YES + + + + 7 + + + + YES + + AppDelegate + + window + id + + + IBUserSource + + + + + + 0 + + 3 + 3.0 + + diff --git a/AdJitsu/MainWindow.xib.designer.cs b/AdJitsu/MainWindow.xib.designer.cs new file mode 100644 index 00000000..94947a39 --- /dev/null +++ b/AdJitsu/MainWindow.xib.designer.cs @@ -0,0 +1,33 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Mono Runtime Version: 4.0.30319.1 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +// ------------------------------------------------------------------------------ + +namespace AdJitsu { + + + // Base type probably should be MonoTouch.Foundation.NSObject or subclass + [MonoTouch.Foundation.Register("AppDelegate")] + public partial class AppDelegate { + + private MonoTouch.UIKit.UIWindow __mt_window; + + #pragma warning disable 0169 + [MonoTouch.Foundation.Connect("window")] + private MonoTouch.UIKit.UIWindow window { + get { + this.__mt_window = ((MonoTouch.UIKit.UIWindow)(this.GetNativeField("window"))); + return this.__mt_window; + } + set { + this.__mt_window = value; + this.SetNativeField("window", value); + } + } + } +} diff --git a/AdJitsu/Makefile b/AdJitsu/Makefile new file mode 100644 index 00000000..08576014 --- /dev/null +++ b/AdJitsu/Makefile @@ -0,0 +1,7 @@ +all: adjitsu.dll + +adjitsu.dll: Makefile adjitsu.cs + /Developer/MonoTouch/usr/bin/btouch adjitsu.cs + +clean: + -rm *.dll \ No newline at end of file diff --git a/AdJitsu/README.md b/AdJitsu/README.md new file mode 100644 index 00000000..a2316564 --- /dev/null +++ b/AdJitsu/README.md @@ -0,0 +1,45 @@ +Bindings to the Adjitsu library +=============================== + +MonoTouch bindings for the AdJitsu library. + +Building +======== + +To build the sample, load the solution into MonoDevelop and run it, +the sample is a copy of the sample Adjitsu SDK app. You need to +obtain the libAdjitsuSDK.a yourself and place it in this directory. + +If you want to update the bindings to the Adjitsu library update the +adjitsu.cs file and run the "make" command. + +API +=== + +The code lives in the Adjitsu namespace, with the AdjitsuView and +AdjitsuViewDelegate classes. This supports the MonoTouch dual event +system: either use the Delegate property in the AdjitsuView to connect +an instance of the AdjitsuViewDelegate, or you can connect +individually to the various C# events on the view, like this: + + ad = new AdjitsuView (bounds); + ad.FinishedLoadingScene += delegate { + Console.WriteLine ("done"); + }; + +Using Adjitsu.dll with your own Software +======================================== + +To link this application with MonoTouch, make sure that your iPhone +Build settings pass the following options to mtouch: + +For Simulator: + + --cxx --gcc_flags "-framework AVFoundation -framework CoreLocation -framework CoreMedia -framework CoreMotion -framework CoreText -framework MediaPlayer -framework MobileCoreServices -framework OpenGLES -framework QuartzCore -L${ProjectDir} -lAdJitsuSDK -force_load ${ProjectDir}/libAdJitsuSDK.a -lxml2 -lsqlite3 -framework CoreGraphics -framework QuartzCore" + +For Device, you must add "--armv7" to the command line, make it look like this: + + --armv7 --cxx --gcc_flags "-framework AVFoundation -framework CoreLocation -framework CoreMedia -framework CoreMotion -framework CoreText -framework MediaPlayer -framework MobileCoreServices -framework OpenGLES -framework QuartzCore -L${ProjectDir} -lAdJitsuSDK -force_load ${ProjectDir}/libAdJitsuSDK.a -lxml2 -lsqlite3 -framework CoreGraphics -framework QuartzCore" + +The requirement for --armv7 is because AdJitsu does not ship libraries +that will run on the older phones. \ No newline at end of file diff --git a/AdJitsu/SampleAdjitsu.cs b/AdJitsu/SampleAdjitsu.cs new file mode 100644 index 00000000..0d5cabf4 --- /dev/null +++ b/AdJitsu/SampleAdjitsu.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using MonoTouch.Foundation; +using MonoTouch.UIKit; +using MonoTouch.ObjCRuntime; +using System.Drawing; +using AdJitsu; + +namespace AdJitsu +{ + public class SampleAdjitsu : UIViewController + { + + #region Ad Configuration parameters + + static RectangleF bannerSizePad = new RectangleF (0, 0, 728, 90); + static RectangleF bannerSizePhone = new RectangleF (0, 0, 320, 48); + const float borderSizePad = 20; + const float borderSizePhone = 0; + + #endregion + + UIView adContainer; + AdJitsuView ad; + UILabel status; + + public SampleAdjitsu () : base (NSObjectFlag.Empty) + { + } + + public override void ViewDidLoad () + { + base.ViewDidLoad (); + + AddButtons (); + + bool phone = UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Phone; + var bannerRect = phone ? bannerSizePhone : bannerSizePad; + var border = phone ? borderSizePhone : borderSizePad; + var bounds = View.Bounds; + + adContainer = new UIView (new RectangleF (new PointF ((bounds.Width-bannerRect.Width) / 2f, bounds.Height-bannerRect.Height - border), bannerSizePad.Size)){ + AutoresizingMask = UIViewAutoresizing.FlexibleLeftMargin | UIViewAutoresizing.FlexibleRightMargin | UIViewAutoresizing.FlexibleTopMargin + }; + View.AddSubview (adContainer); + ResetView (); + } + + public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation) + { + return true; + } + + void ResetView () + { + if (ad != null) + ad.RemoveFromSuperview (); + + ad = new AdJitsuView (adContainer.Bounds); + ad.WillOpen += delegate { + status.Text = "Status: Opening"; + }; + ad.WillClose += delegate { + status.Text = "Status: will close"; + }; + ad.FinishedLoadingScene += delegate { + status.Text = "Finished Loading scene"; + }; + ad.FailedLoadingScene += delegate { + status.Text = "Failed to load scene"; + }; + + adContainer.AddSubview (ad); + + Reload (); + } + + const string deviceAd = "http://cooliris-eng-3d.s3-website-us-east-1.amazonaws.com/production/3B38B58804D24BFBBC06ABA680E8F7B2/camera.zip"; + const string simulatorAd = "http://cooliris-eng-3d.s3-website-us-east-1.amazonaws.com/production/3B38B58804D24BFBBC06ABA680E8F7B2/camera-iphonesimulator.zip"; + + void Reload () + { + ad.LoadScene (new NSUrl (Runtime.Arch == Arch.DEVICE ? deviceAd : simulatorAd)); + } + + void AddButtons () + { + var reload = UIButton.FromType (UIButtonType.RoundedRect); + reload.Frame = new RectangleF (40, 40, 120, 48); + reload.SetTitle ("Reload ad", UIControlState.Normal); + View.AddSubview (reload); + reload.TouchDown += delegate { Reload (); }; + + var recreate = UIButton.FromType (UIButtonType.RoundedRect); + recreate.Frame = new RectangleF (40, 100, 120, 48); + recreate.SetTitle ("Recreate View", UIControlState.Normal); + View.AddSubview (recreate); + recreate.TouchDown += delegate { ResetView (); }; + + status = new UILabel (new RectangleF (10, 180, 310, 240)) { + Text = "Adjitsu Demo Status" + }; + View.AddSubview (status); + } + } +} + diff --git a/AdJitsu/adjitsu.cs b/AdJitsu/adjitsu.cs new file mode 100644 index 00000000..c1edca11 --- /dev/null +++ b/AdJitsu/adjitsu.cs @@ -0,0 +1,67 @@ +// +// Bindings to the AdJitsu library +// +// Author: +// Miguel de Icaza +// +// Copyright 2011 Xamarin, Inc. +// +using System; +using System.Drawing; +using MonoTouch.UIKit; +using MonoTouch.Foundation; + +namespace AdJitsu { + + [BaseType (typeof (UIView), Delegates=new string [] { "WeakDelegate" }, Events=new Type [] {typeof (AdJitsuViewDelegate)})] + interface AdJitsuView { + [Export ("initWithFrame:")] + IntPtr Constructor (RectangleF frame); + + [Export ("loadSceneAtURL:")] + void LoadScene (NSUrl url); + + [Static, Export ("majorVersionString")] + string MajorVersion { get; } + + [Static, Export ("buildVersionString")] + string BuildVersion { get; } + + [Static, Export ("fullVersionString")] + string FullVersion { get; } + + [Export ("delegate"), NullAllowed] + NSObject WeakDelegate { get; set; } + + [Wrap ("WeakDelegate")] + AdJitsuViewDelegate Delegate { get; set; } + } + + [BaseType (typeof (NSObject))] + [Model] + interface AdJitsuViewDelegate { + [Export ("adJitsuView:didFinishLoadingSceneAtURL:"), EventArgs ("AdJitsuUrl")] + void FinishedLoadingScene (AdJitsuView view, NSUrl atUrl); + + [Export ("adJitsuView:didFailLoadingSceneAtURL:"), EventArgs ("AdJitsuUrl")] + void FailedLoadingScene (AdJitsuView view, NSUrl atUrl); + + [Export ("adJitsuView:willTransitionToFullScreen:"), DefaultValue (true), DelegateName ("AdJitsuTransitionScreen")] + bool WillTransitionPresentation (AdJitsuView view, bool goingFullscreen); + + [Export ("adJitsuView:didTransitionToFullScreen:"), EventArgs ("AdJitsuScreen")] + void TransitionedPresentation (AdJitsuView view, bool toFullScreen); + + [Export ("adJitsuView:didOpenPageAtIndex:"), EventArgs ("AdJitsuPage")] + void OpenedPage (AdJitsuView view, int pageIndex); + + [Export ("adJitsuView:willClosePageAtIndex:"), EventArgs ("AdJitsuPage")] + void WillClosePage (AdJitsuView view, int pageIndex); + + [Export ("adJitsuView:willOpenURL:"), EventArgs ("AdJitsuUrl")] + void WillOpen (AdJitsuView view, NSUrl url); + + [Export ("adJitsuView:willCloseURL:"), EventArgs ("AdJitsuUrl")] + void WillClose (AdJitsuView view, NSUrl url); + } +} \ No newline at end of file diff --git a/AdJitsu/adjitsu.dll b/AdJitsu/adjitsu.dll new file mode 100755 index 0000000000000000000000000000000000000000..680e636c8d836311640f790934864cff057b7bd5 GIT binary patch literal 11776 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 T0tgcSoq)lK{pt1pE&~4vgJ8<( literal 0 HcmV?d00001