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)); }); }); }
void RefreshLoop(TabPerson person) { if (!person.IsVerified) { Action callback = () => person.AssociatedUser.RefreshInBackground (new TabRefreshCallback ((o, e) => RefreshLoop (person))); var timer = new SignupTimer (20000, 20000, callback); timer.Start (); } else { var toast = Toast.MakeText (this, "Successfully registered", ToastLength.Long); toast.Show (); } }
void UpdateTabStatistics(TabPerson other, SelectedUserInfo selectedContact, bool force = false) { var p = other.ToParse (); var self = TabPerson.CurrentPerson.ToParse (); var query = TabObject.CreateTabListQuery (self, p); if (force) query.SetCachePolicy (ParseQuery.CachePolicy.NetworkElseCache); else { query.SetCachePolicy (ParseQuery.CachePolicy.CacheElseNetwork); query.MaxCacheAge = 1000 * 60; // 1 minute } query.FindInBackground (new TabFindCallback ((ps, ex) => { if (ex != null) { Android.Util.Log.Error ("TabStats", ex, "Error while retrieving tab list"); statsSpinner.Visibility = ViewStates.Invisible; flashBarCtrl.ShowBar (() => UpdateTabStatistics (other, selectedContact, force), withMessageId: Resource.String.flashbar_stats_error); return; } var tabs = ps.Select (TabObject.FromParse).ToArray (); if (tabs.Length == 0) { statsSpinner.Visibility = ViewStates.Invisible; karmaBar.SetAnimatedVisibility (false); return; } var counts = tabs.GroupBy (tab => tab.Type.Name).ToArray (); int totalPositive = 0, totalNegative = 0; int totalTypes = counts.Length; foreach (var group in counts) { var badge = BadgeInstances[group.Key]; int positive = 0, negative = 0; foreach (var tab in group) { if ((tab.Originator == other && tab.Direction == TabDirection.Receiving) || (tab.Originator == TabPerson.CurrentPerson && tab.Direction == TabDirection.Giving)) positive++; if ((tab.Originator == TabPerson.CurrentPerson && tab.Direction == TabDirection.Receiving) || (tab.Originator == other && tab.Direction == TabDirection.Giving)) negative++; } totalPositive += positive; totalNegative += negative; Activity.RunOnUiThread (() => { if (selectedContact.DisplayName != userBadge.SelectedUser.DisplayName) return; //badge.Count = positive - negative; badge.SetCount (positive - negative, true); if (--totalTypes == 0) { if (totalPositive == 0 && totalNegative == 0) karmaBar.SetAnimatedVisibility (false); else { karmaBar.SetAnimatedVisibility (true); karmaBar.SetKarmaBasedOnValues (totalPositive, totalNegative); } statsSpinner.Visibility = ViewStates.Invisible; } }); } })); }