From 7b30d4727198fd8049dce64eb982489f24be2fc8 Mon Sep 17 00:00:00 2001 From: Michael Henke Date: Fri, 30 Aug 2013 14:38:16 -0700 Subject: [PATCH 01/12] [TwitterService] added location support --- .../Xamarin.Social.iOS.csproj | 3 ++ src/Xamarin.Social/Item.cs | 16 ++++++++++ src/Xamarin.Social/Location.cs | 31 +++++++++++++++++++ src/Xamarin.Social/Services/TwitterService.cs | 10 ++++++ src/Xamarin.Social/Xamarin.Social.csproj | 1 + 5 files changed, 61 insertions(+) create mode 100644 src/Xamarin.Social/Location.cs diff --git a/src/Xamarin.Social.iOS/Xamarin.Social.iOS.csproj b/src/Xamarin.Social.iOS/Xamarin.Social.iOS.csproj index 80e6023..139c864 100644 --- a/src/Xamarin.Social.iOS/Xamarin.Social.iOS.csproj +++ b/src/Xamarin.Social.iOS/Xamarin.Social.iOS.csproj @@ -105,6 +105,9 @@ WebEx.cs + + Location.cs + diff --git a/src/Xamarin.Social/Item.cs b/src/Xamarin.Social/Item.cs index 45d76b6..0447223 100644 --- a/src/Xamarin.Social/Item.cs +++ b/src/Xamarin.Social/Item.cs @@ -124,6 +124,22 @@ public bool HasAttachments { /// public IList Files { get; set; } + private Location _location = null; + /// + /// Gets or sets the location associated with this item. + /// + public Location Location { + get { + if (_location == null) { + _location = new Location (); + } + return _location; + } + set { + _location = value; + } + } + #if SUPPORT_VIDEO /// /// Attached video. diff --git a/src/Xamarin.Social/Location.cs b/src/Xamarin.Social/Location.cs new file mode 100644 index 0000000..9c1f5cb --- /dev/null +++ b/src/Xamarin.Social/Location.cs @@ -0,0 +1,31 @@ +// +// Copyright 2013, Michael Henke +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +using System; + +namespace Xamarin.Social +{ + public class Location + { + public double Latitude { get; set; } + + public double Longitude { get; set; } + + public Location () + { + } + } +} + diff --git a/src/Xamarin.Social/Services/TwitterService.cs b/src/Xamarin.Social/Services/TwitterService.cs index 7d5ca71..e8f64ca 100644 --- a/src/Xamarin.Social/Services/TwitterService.cs +++ b/src/Xamarin.Social/Services/TwitterService.cs @@ -23,6 +23,8 @@ using System.Linq; using Xamarin.Auth; +using MonoTouch.CoreLocation; + namespace Xamarin.Social.Services { public class TwitterService : OAuth1Service @@ -71,10 +73,18 @@ public override Task ShareItemAsync (Item item, Account account, CancellationTok if (item.Images.Count == 0) { req = CreateRequest ("POST", new Uri ("https://api.twitter.com/1.1/statuses/update.json"), account); req.Parameters["status"] = status; + if (item.Location.Latitude != 0 && item.Location.Longitude != 0) { + req.Parameters ["lat"] = item.Location.Latitude.ToString(); + req.Parameters ["long"] = item.Location.Longitude.ToString(); + } } else { req = CreateRequest ("POST", new Uri ("https://api.twitter.com/1.1/statuses/update_with_media.json"), account); req.AddMultipartData ("status", status); + if (item.Location.Latitude != 0 && item.Location.Longitude != 0) { + req.AddMultipartData ("lat", item.Location.Latitude.ToString()); + req.AddMultipartData ("long", item.Location.Longitude.ToString()); + } foreach (var i in item.Images.Take (MaxImages)) { i.AddToRequest (req, "media[]"); } diff --git a/src/Xamarin.Social/Xamarin.Social.csproj b/src/Xamarin.Social/Xamarin.Social.csproj index 5dd74bb..278d804 100644 --- a/src/Xamarin.Social/Xamarin.Social.csproj +++ b/src/Xamarin.Social/Xamarin.Social.csproj @@ -77,6 +77,7 @@ WebEx.cs + From 69c33c0b75bb60fa71cee2258582a5806839b2b3 Mon Sep 17 00:00:00 2001 From: Michael Henke Date: Sat, 31 Aug 2013 12:00:00 -0700 Subject: [PATCH 02/12] [FacebookService] added (very simple) location support --- .../Services/FacebookService.cs | 40 ++++++++++++++++++- src/Xamarin.Social/Services/TwitterService.cs | 2 - 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/Xamarin.Social/Services/FacebookService.cs b/src/Xamarin.Social/Services/FacebookService.cs index 9462b0a..dadfbb9 100644 --- a/src/Xamarin.Social/Services/FacebookService.cs +++ b/src/Xamarin.Social/Services/FacebookService.cs @@ -20,6 +20,8 @@ using System.Text; using System.Threading; using Xamarin.Auth; +using System.Diagnostics; +using System.Json; namespace Xamarin.Social.Services { @@ -75,8 +77,40 @@ static string GetValueFromJson (string json, string key) return r; } - public override Task ShareItemAsync (Item item, Account account, CancellationToken cancellationToken) + public async override Task ShareItemAsync (Item item, Account account, CancellationToken cancellationToken) { + string placeId = null; + + if (item.Location.Latitude != 0 && item.Location.Longitude != 0) + { + Request placeRequest = CreateRequest("GET", new Uri ("https://graph.facebook.com/search"), account); + + placeRequest.Parameters ["type"] = "place"; + placeRequest.Parameters ["center"] = item.Location.Latitude.ToString() + "," + item.Location.Longitude.ToString(); + placeRequest.Parameters ["distance"] = "100"; + + await placeRequest.GetResponseAsync(cancellationToken).ContinueWith(reqTask => { + var obj = JsonObject.Parse(reqTask.Result.GetResponseText()); + + if (obj.ContainsKey("data") && obj["data"].Count > 0 && obj["data"][0].ContainsKey("id")) + placeId = obj ["data"] [0] ["id"]; + + return ShareItemWithLocationAsync(item, account, placeId, cancellationToken); + }); + ; + } + else + { + await ShareItemWithLocationAsync(item, account, null, cancellationToken).ContinueWith(reqTask => { + + return reqTask; + }); + } + } + + public Task ShareItemWithLocationAsync (Item item, Account account, string placeId, CancellationToken cancellationToken) + { + Request req; if (item.Images.Count > 0) { @@ -97,6 +131,10 @@ public override Task ShareItemAsync (Item item, Account account, CancellationTok if (item.Links.Count > 0) { req.Parameters["link"] = item.Links.First ().AbsoluteUri; } + if (placeId != null) { + + req.Parameters.Add("place", placeId); + } } return req.GetResponseAsync (cancellationToken).ContinueWith (reqTask => { diff --git a/src/Xamarin.Social/Services/TwitterService.cs b/src/Xamarin.Social/Services/TwitterService.cs index e8f64ca..745f251 100644 --- a/src/Xamarin.Social/Services/TwitterService.cs +++ b/src/Xamarin.Social/Services/TwitterService.cs @@ -23,8 +23,6 @@ using System.Linq; using Xamarin.Auth; -using MonoTouch.CoreLocation; - namespace Xamarin.Social.Services { public class TwitterService : OAuth1Service From 1e8d0cda5d15a67796202be8cdfd351934bc6f83 Mon Sep 17 00:00:00 2001 From: Michael Henke Date: Sat, 31 Aug 2013 12:15:59 -0700 Subject: [PATCH 03/12] [FacebookService] added (very simple) location support to posts with images as well --- src/Xamarin.Social/Services/FacebookService.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Xamarin.Social/Services/FacebookService.cs b/src/Xamarin.Social/Services/FacebookService.cs index dadfbb9..abed1f8 100644 --- a/src/Xamarin.Social/Services/FacebookService.cs +++ b/src/Xamarin.Social/Services/FacebookService.cs @@ -124,6 +124,10 @@ public Task ShareItemWithLocationAsync (Item item, Account account, string place message.Append (l.AbsoluteUri); } req.AddMultipartData ("message", message.ToString ()); + if (placeId != null) { + + req.AddMultipartData("place", placeId); + } } else { req = CreateRequest ("POST", new Uri ("https://graph.facebook.com/me/feed"), account); From a08a2e38ba6e50af8916c9bc7d3ff318c666a387 Mon Sep 17 00:00:00 2001 From: Michael Henke Date: Wed, 25 Sep 2013 13:31:24 -0700 Subject: [PATCH 04/12] fixed compiling for Android --- src/Xamarin.Social.Android/Xamarin.Social.Android.csproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Xamarin.Social.Android/Xamarin.Social.Android.csproj b/src/Xamarin.Social.Android/Xamarin.Social.Android.csproj index 29c0da2..ecc670b 100644 --- a/src/Xamarin.Social.Android/Xamarin.Social.Android.csproj +++ b/src/Xamarin.Social.Android/Xamarin.Social.Android.csproj @@ -96,6 +96,9 @@ WebEx.cs + + Location.cs + From b2f0e9c679e3e525135a6e5779dfba542c072cae Mon Sep 17 00:00:00 2001 From: Michael Henke Date: Thu, 26 Sep 2013 14:35:14 -0700 Subject: [PATCH 05/12] added place_id support to twitter sharing --- src/Xamarin.Social/Services/TwitterService.cs | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/Xamarin.Social/Services/TwitterService.cs b/src/Xamarin.Social/Services/TwitterService.cs index 745f251..bd0164c 100644 --- a/src/Xamarin.Social/Services/TwitterService.cs +++ b/src/Xamarin.Social/Services/TwitterService.cs @@ -98,6 +98,56 @@ public override Task ShareItemAsync (Item item, Account account, CancellationTok } });*/ } + + public Task ShareItemWithLocationAsync (Item item, Account account, string placeId, CancellationToken cancellationToken) + { + // + // Combine the links into the tweet + // + var sb = new StringBuilder (); + sb.Append (item.Text); + foreach (var l in item.Links) { + sb.Append (" "); + sb.Append (l.AbsoluteUri); + } + var status = sb.ToString (); + + // + // Create the request + // + Request req; + if (item.Images.Count == 0) { + req = CreateRequest ("POST", new Uri ("https://api.twitter.com/1.1/statuses/update.json"), account); + req.Parameters["status"] = status; + if (item.Location.Latitude != 0 && item.Location.Longitude != 0) { + req.Parameters ["lat"] = item.Location.Latitude.ToString(); + req.Parameters ["long"] = item.Location.Longitude.ToString(); + req.Parameters ["place_id"] = placeId; + } + } + else { + req = CreateRequest ("POST", new Uri ("https://api.twitter.com/1.1/statuses/update_with_media.json"), account); + req.AddMultipartData ("status", status); + if (item.Location.Latitude != 0 && item.Location.Longitude != 0) { + req.AddMultipartData ("lat", item.Location.Latitude.ToString()); + req.AddMultipartData ("long", item.Location.Longitude.ToString()); + req.AddMultipartData ("place_id", placeId); + } + foreach (var i in item.Images.Take (MaxImages)) { + i.AddToRequest (req, "media[]"); + } + } + + // + // Send it + // + return req.GetResponseAsync (cancellationToken);/*.ContinueWith ((Task reqTask) => { + var content = reqTask.Result.GetResponseText (); + if (!content.Contains (" Date: Wed, 2 Oct 2013 13:30:36 -0700 Subject: [PATCH 06/12] using my own fork of Xamarin.Auth to fix twitter auth issues --- Xamarin.Auth | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Xamarin.Auth b/Xamarin.Auth index ea5965b..9c19d90 160000 --- a/Xamarin.Auth +++ b/Xamarin.Auth @@ -1 +1 @@ -Subproject commit ea5965b3fe2df33e59bcd85ff95f6f7898fc28e1 +Subproject commit 9c19d90e52994188def9e12e0bbc981a3943a752 From abcfd5106249210f7c21a55d1a360d321cbc0c4a Mon Sep 17 00:00:00 2001 From: Michael Henke Date: Mon, 30 Mar 2015 07:32:01 -0700 Subject: [PATCH 07/12] prepare upgrade to latest Xamarin Social --- .gitignore | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index ec4e9fc..919d235 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,14 @@ -*.ide -.DS_Store -*.userprefs -*.user -*.suo -*.quicktest -bin -obj +*.ide +.DS_Store +*.userprefs +*.user +*.suo +*.quicktest +bin +obj test-results -components -.xpkg -docs \ No newline at end of file +src/Components +samples/ + components + .xpkg + docs From 9062e50091711131e1f6c22153878fa92fafe1f6 Mon Sep 17 00:00:00 2001 From: Michael Henke Date: Thu, 25 Jun 2015 09:42:46 -0700 Subject: [PATCH 08/12] updated Xamarin Mobile reference --- src/Xamarin.Social.iOS/Xamarin.Social.iOS.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Xamarin.Social.iOS/Xamarin.Social.iOS.csproj b/src/Xamarin.Social.iOS/Xamarin.Social.iOS.csproj index 139c864..bbd8b59 100644 --- a/src/Xamarin.Social.iOS/Xamarin.Social.iOS.csproj +++ b/src/Xamarin.Social.iOS/Xamarin.Social.iOS.csproj @@ -46,7 +46,7 @@ - ..\Components\xamarin.mobile-0.7.5\lib\ios-unified\Xamarin.Mobile.dll + ..\..\..\..\Components\xamarin.mobile-0.7.6\lib\ios-unified\Xamarin.Mobile.dll @@ -120,7 +120,7 @@ - 0.7.5 + 0.7.6 False From 1db1ce0d43cf0df51676a1ff8946f0c61ea2970f Mon Sep 17 00:00:00 2001 From: Michael Henke Date: Fri, 26 Jun 2015 15:53:50 -0700 Subject: [PATCH 09/12] catch Facebook 403 forbidden causing a System.AggregateException in Xamarin.Social.Services.FacebookService. --- .gitignore | 1 + .../Services/FacebookService.cs | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 919d235..bbdbd6b 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ samples/ components .xpkg docs +StyleCop.Cache diff --git a/src/Xamarin.Social/Services/FacebookService.cs b/src/Xamarin.Social/Services/FacebookService.cs index abed1f8..9a82612 100644 --- a/src/Xamarin.Social/Services/FacebookService.cs +++ b/src/Xamarin.Social/Services/FacebookService.cs @@ -101,10 +101,19 @@ await placeRequest.GetResponseAsync(cancellationToken).ContinueWith(reqTask => { } else { - await ShareItemWithLocationAsync(item, account, null, cancellationToken).ContinueWith(reqTask => { - - return reqTask; - }); + try + { + await ShareItemWithLocationAsync(item, account, null, cancellationToken).ContinueWith(reqTask => { + + return reqTask; + }); + } + catch(Exception e) + { + #if DEBUG + throw(e); + #endif + } } } @@ -146,7 +155,7 @@ public Task ShareItemWithLocationAsync (Item item, Account account, string place if (!content.Contains ("\"id\"")) { throw new SocialException ("Facebook returned an unrecognized response."); } - }); + }); } } } From ca32b9cb65b38293c978c72255b44144887dbaef Mon Sep 17 00:00:00 2001 From: Michael Henke Date: Tue, 4 Aug 2015 10:57:03 -0700 Subject: [PATCH 10/12] addressed comment on pull request #25: https://github.com/xamarin/Xamarin.Social/pull/25#discussion_r6802507 --- src/Xamarin.Social/Item.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Xamarin.Social/Item.cs b/src/Xamarin.Social/Item.cs index 0447223..216228a 100644 --- a/src/Xamarin.Social/Item.cs +++ b/src/Xamarin.Social/Item.cs @@ -124,19 +124,19 @@ public bool HasAttachments { /// public IList Files { get; set; } - private Location _location = null; + private Location location = null; /// /// Gets or sets the location associated with this item. /// public Location Location { get { - if (_location == null) { - _location = new Location (); + if (location == null) { + location = new Location (); } - return _location; + return location; } set { - _location = value; + location = value; } } From aa68775c1f6e08afb5698635741ae7c3d7335939 Mon Sep 17 00:00:00 2001 From: Michael Henke Date: Tue, 4 Aug 2015 10:58:17 -0700 Subject: [PATCH 11/12] addressed comment on pull request #25: https://github.com/xamarin/Xamarin.Social/pull/25#discussion-diff-6802599 --- .../Services/FacebookService.cs | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/Xamarin.Social/Services/FacebookService.cs b/src/Xamarin.Social/Services/FacebookService.cs index 9a82612..caaa334 100644 --- a/src/Xamarin.Social/Services/FacebookService.cs +++ b/src/Xamarin.Social/Services/FacebookService.cs @@ -89,24 +89,22 @@ public async override Task ShareItemAsync (Item item, Account account, Cancellat placeRequest.Parameters ["center"] = item.Location.Latitude.ToString() + "," + item.Location.Longitude.ToString(); placeRequest.Parameters ["distance"] = "100"; - await placeRequest.GetResponseAsync(cancellationToken).ContinueWith(reqTask => { - var obj = JsonObject.Parse(reqTask.Result.GetResponseText()); + var reqTask = await placeRequest.GetResponseAsync(cancellationToken).ConfigureAwait(false); - if (obj.ContainsKey("data") && obj["data"].Count > 0 && obj["data"][0].ContainsKey("id")) - placeId = obj ["data"] [0] ["id"]; + var obj = JsonObject.Parse(reqTask.GetResponseText()); - return ShareItemWithLocationAsync(item, account, placeId, cancellationToken); - }); - ; + if (obj.ContainsKey("data") && obj["data"].Count > 0 && obj["data"][0].ContainsKey("id")) + placeId = obj ["data"] [0] ["id"]; + + await ShareItemWithLocationAsync(item, account, placeId, cancellationToken).ConfigureAwait(false); + + return; } else { try { - await ShareItemWithLocationAsync(item, account, null, cancellationToken).ContinueWith(reqTask => { - - return reqTask; - }); + await ShareItemWithLocationAsync(item, account, null, cancellationToken).ConfigureAwait(false); } catch(Exception e) { @@ -114,6 +112,7 @@ await ShareItemWithLocationAsync(item, account, null, cancellationToken).Continu throw(e); #endif } + return; } } From 8d6f76ea4b0f37a9cb1f7e78bf1863162717a30b Mon Sep 17 00:00:00 2001 From: Michael Henke Date: Sat, 18 Jun 2016 07:02:06 -0700 Subject: [PATCH 12/12] do not sync release version of the parent project/solution --- src/Xamarin.Social.iOS/Xamarin.Social.iOS.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Xamarin.Social.iOS/Xamarin.Social.iOS.csproj b/src/Xamarin.Social.iOS/Xamarin.Social.iOS.csproj index bbd8b59..48bdd75 100644 --- a/src/Xamarin.Social.iOS/Xamarin.Social.iOS.csproj +++ b/src/Xamarin.Social.iOS/Xamarin.Social.iOS.csproj @@ -10,6 +10,7 @@ Library Xamarin.Social Xamarin.Social.iOS + false True