public static void RegisterPlace(string placeName, Tuple<double, double> latLng) { if (string.IsNullOrWhiteSpace (placeName) || localLocations.Contains (placeName)) return; var queryChecker = new ParseQuery ("Place"); queryChecker.SetCachePolicy (ParseQuery.CachePolicy.NetworkOnly); queryChecker.WhereEqualTo ("placeName", placeName); queryChecker.CountInBackground (new TabCountCallback ((c, e) => { if (e == null && c == 0 && localLocations.Add (placeName)) { var place = new TabPlace (null) { PlaceName = placeName, LatLng = latLng, Person = TabPerson.CurrentPerson }; place.ToParse ().SaveInBackground (); } })); }
public Task<TabPerson> ToPerson() { if (person != null) return person.Task; person = new TaskCompletionSource<TabPerson> (); var recipientQuery = new ParseQuery ("Person"); recipientQuery.SetCachePolicy (ParseQuery.CachePolicy.CacheElseNetwork); if (Emails.Any ()) recipientQuery.WhereContainedIn ("emails", Emails.Select (TabPerson.MD5Hash).ToArray ()); else recipientQuery.WhereEqualTo ("displayName", DisplayName); ParseObject recipient = null; TabPerson recipientPerson = null; recipientQuery.GetFirstInBackground (new TabGetCallback ((o, e) => { if (o != null) { recipient = o; recipientPerson = TabPerson.FromParse (recipient); // TODO: add the emails that are in Emails and not in recipientPerson.Emails person.SetResult (recipientPerson); } else { recipientPerson = new TabPerson { DisplayName = DisplayName, Emails = Emails, }; recipient = recipientPerson.ToParse (); recipient.SaveInBackground (new TabSaveCallback (ex => { if (ex == null) person.SetResult (recipientPerson); else { Android.Util.Log.Error ("PersonCreator", ex.ToString ()); person.SetException (ex); } })); recipientQuery.ClearCachedResult (); } })); return person.Task; }
internal void LaunchApp(Activity ctx, ParseUser withUser, Action uiCallback) { // Fetch the person corresponding to the user Task.Factory.StartNew (() => { var query = new ParseQuery ("Person"); query.SetCachePolicy (ParseQuery.CachePolicy.CacheElseNetwork); query.WhereEqualTo ("parseUser", withUser); query.Include ("parseUser"); ParseObject self = null; try { self = query.First; } catch (ParseException ex) { // We may have a stall result from a previous registration if (query.HasCachedResult) { query.ClearCachedResult (); try { self = query.First; } catch { Android.Util.Log.Error ("Landing", "Error when trying to retrieve user 2. Normal if empty. {0}", ex.ToString ()); } } Android.Util.Log.Error ("Landing", "Error when trying to retrieve user. Normal if empty. {0}", ex.ToString ()); } // First time ever, fill the info if (self == null) { TabPerson person = null; // Check if our TabPerson wasn't created indirectly by another user query = new ParseQuery ("Person"); query.WhereEqualTo ("emails", TabPerson.MD5Hash (withUser.Email)); try { person = TabPerson.FromParse (query.First); person.AssociatedUser = withUser; } catch { // We use the main address email we got by parseUser // and we will fill the rest lazily later from profile // idem for the display name person = new TabPerson { AssociatedUser = withUser, Emails = new string[] { withUser.Email } }; } return person; } else { TabPerson.CurrentPerson = TabPerson.FromParse (self); return null; } }).ContinueWith (t => { ctx.RunOnUiThread (() => { // If the user was created, we setup a CursorLoader to query the information we need if (t.Result != null) { var person = t.Result; person.DisplayName = profile.DisplayName; person.Emails = profile.Emails.Union (person.Emails); person.ToParse ().SaveEventually (); TabPerson.CurrentPerson = person; } if (uiCallback != null) uiCallback (); ctx.Finish (); ctx.StartActivity (typeof (MainActivity)); }); }); }