public static void SaveFavourites(ConversationListObject obj) // this is to save individual file { if (obj == null) { return; } lock (favReadWriteLock) { using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) { if (!store.DirectoryExists("FAVS")) { store.CreateDirectory("FAVS"); } string fName = "FAVS" + "\\" + obj.Msisdn.Replace(":", "_"); // ttoohis will handle GC using (var file = store.OpenFile(fName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) { using (BinaryWriter writer = new BinaryWriter(file)) { writer.Seek(0, SeekOrigin.Begin); obj.WriteFavOrPending(writer); writer.Flush(); writer.Close(); } file.Close(); file.Dispose(); } } } }
public static void deleteMultipleRows(List <ContactInfo.DelContacts> ids) { if (ids == null || ids.Count == 0) { return; } bool shouldSubmit = false; using (HikeUsersDb context = new HikeUsersDb(App.UsersDBConnectionstring)) { //using (HikeChatsDb chats = new HikeChatsDb(App.MsgsDBConnectionstring)) { for (int i = 0; i < ids.Count; i++) { context.users.DeleteAllOnSubmit <ContactInfo>(DbCompiledQueries.GetUsersWithGivenId(context, ids[i].Id)); if (App.ViewModel.ConvMap.ContainsKey(ids[i].Msisdn)) { ConversationListObject obj = App.ViewModel.ConvMap[ids[i].Msisdn]; obj.ContactName = null; ConversationTableUtils.saveConvObject(obj, obj.Msisdn); //ConversationTableUtils.saveConvObjectList(); } } } SubmitWithConflictResolve(context); } }
public HikeViewModel(List <ConversationListObject> convList) { _convMap = new Dictionary <string, ConversationListObject>(convList.Count); _pendingReq = new ObservableCollection <ConversationListObject>(); _favList = new ObservableCollection <ConversationListObject>(); List <ConversationBox> listConversationBox = new List <ConversationBox>(); // this order should be maintained as _convMap should be populated before loading fav list for (int i = 0; i < convList.Count; i++) { ConversationListObject convListObj = convList[i]; _convMap[convListObj.Msisdn] = convListObj; convListObj.ConvBoxObj = new ConversationBox(convListObj);//context menu wil bind on page load listConversationBox.Add(convListObj.ConvBoxObj); } _messageListPageCollection = new ObservableCollection <ConversationBox>(listConversationBox); MiscDBUtil.LoadFavourites(_favList, _convMap); int count = 0; App.appSettings.TryGetValue <int>(HikeViewModel.NUMBER_OF_FAVS, out count); if (count != _favList.Count) // values are not loaded, move to backup plan { _favList.Clear(); MiscDBUtil.LoadFavouritesFromIndividualFiles(_favList, _convMap); } RegisterListeners(); }
public static ConversationListObject addGroupConversation(ConvMessage convMessage, string groupName) { /* * Msisdn : GroupId * Contactname : GroupOwner */ byte[] avatar = MiscDBUtil.getThumbNailForMsisdn(convMessage.Msisdn); ConversationListObject obj = new ConversationListObject(convMessage.Msisdn, groupName, convMessage.Message, true, convMessage.Timestamp, avatar, convMessage.MessageStatus, convMessage.MessageId); if (convMessage.GrpParticipantState == ConvMessage.ParticipantInfoState.MEMBERS_JOINED) { string[] vals = convMessage.Message.Split(';'); if (vals.Length == 2) { obj.LastMessage = vals[1]; } else { obj.LastMessage = convMessage.Message; } } string msisdn = obj.Msisdn.Replace(":", "_"); saveConvObject(obj, msisdn); int convs = 0; App.appSettings.TryGetValue <int>(HikeViewModel.NUMBER_OF_CONVERSATIONS, out convs); App.WriteToIsoStorageSettings(HikeViewModel.NUMBER_OF_CONVERSATIONS, convs + 1); //saveNewConv(obj); return(obj); }
public static void SavePendingRequests() { lock (pendingReadWriteLock) { using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) { if (!store.DirectoryExists(MISC_DIR)) { store.CreateDirectory(MISC_DIR); } string fName = MISC_DIR + "\\" + PENDING_REQ_FILE; using (var file = store.OpenFile(fName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite)) { using (BinaryWriter writer = new BinaryWriter(file)) { writer.Seek(0, SeekOrigin.Begin); writer.Write(App.ViewModel.PendingRequests.Count); for (int i = 0; i < App.ViewModel.PendingRequests.Count; i++) { ConversationListObject item = App.ViewModel.PendingRequests[i]; item.WriteFavOrPending(writer); } writer.Flush(); writer.Close(); } file.Close(); file.Dispose(); } } } }
public static void updateOnHikeStatus(string msisdn, bool joined) { if (App.ViewModel.ConvMap.ContainsKey(msisdn)) { ConversationListObject obj = App.ViewModel.ConvMap[msisdn]; obj.IsOnhike = joined; saveConvObject(obj, msisdn); //saveConvObjectList(); } }
public ConversationBox(ConversationListObject c) { InitializeComponent(); this.AvatarImage = c.AvatarImage; this.UserName = c.NameToShow; this.LastMessage = c.LastMessage; this.Timestamp = c.TimeStamp; this.MessageState = c.MessageStatus; this.Msisdn = c.Msisdn; }
private void btnGetSelected_Click(object sender, System.Windows.Input.GestureEventArgs e) { ConversationListObject obj = myListBox.SelectedItem as ConversationListObject; if (obj == null) { return; } PhoneApplicationService.Current.State["objFromConversationPage"] = obj; string uri = "/View/ChatThread.xaml"; NavigationService.Navigate(new Uri(uri, UriKind.Relative)); }
public static void LoadFavouritesFromIndividualFiles(ObservableCollection <ConversationListObject> favList, Dictionary <string, ConversationListObject> _convmap) { lock (favReadWriteLock) { using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) { if (!store.DirectoryExists("FAVS")) { store.CreateDirectory("FAVS"); return; } string[] files = store.GetFileNames("FAVS\\*"); foreach (string fname in files) { using (var file = store.OpenFile("FAVS\\" + fname, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (var reader = new BinaryReader(file)) { ConversationListObject item = new ConversationListObject(); try { item.ReadFavOrPending(reader); if (_convmap.ContainsKey(item.Msisdn)) // if this item is in convList, just mark IsFav to true { favList.Add(_convmap[item.Msisdn]); _convmap[item.Msisdn].IsFav = true; } else { favList.Add(item); } } catch (Exception ex) { Debug.WriteLine(ex); } reader.Close(); } try { file.Close(); file.Dispose(); } catch { } } } } } }
internal static void updateConversation(List <ContactInfo> cn) { //saveConvObjectList(); for (int i = 0; i < cn.Count; i++) { if (App.ViewModel.ConvMap.ContainsKey(cn[i].Msisdn)) { ConversationListObject obj = App.ViewModel.ConvMap[cn[i].Msisdn]; //update UI obj.ContactName = cn[i].Name; obj.IsOnhike = cn[i].OnHike; saveConvObject(obj, obj.Msisdn.Replace(":", "_")); } } }
public static bool updateGroupName(string grpId, string groupName) { if (!App.ViewModel.ConvMap.ContainsKey(grpId)) { return(false); } ConversationListObject obj = App.ViewModel.ConvMap[grpId]; obj.ContactName = groupName; string msisdn = grpId.Replace(":", "_"); saveConvObject(obj, msisdn); //saveConvObjectList(); return(true); }
public void updateProfile_Callback(JObject obj) { Deployment.Current.Dispatcher.BeginInvoke(() => { if (obj != null && HikeConstants.OK == (string)obj[HikeConstants.STAT]) { App.ViewModel.ConvMap[groupId].Avatar = fullViewImageBytes; groupImage.Source = grpImage; groupImage.Height = 83; groupImage.Width = 83; string msg = string.Format(AppResources.GroupImgChangedByGrpMember_Txt, AppResources.You_Txt); ConvMessage cm = new ConvMessage(msg, groupId, TimeUtils.getCurrentTimeStamp(), ConvMessage.State.RECEIVED_READ, -1, -1); cm.GrpParticipantState = ConvMessage.ParticipantInfoState.GROUP_PIC_CHANGED; cm.GroupParticipant = App.MSISDN; JObject jo = new JObject(); jo[HikeConstants.TYPE] = HikeConstants.MqttMessageTypes.GROUP_DISPLAY_PIC; cm.MetaDataString = jo.ToString(Newtonsoft.Json.Formatting.None); ConversationListObject cobj = MessagesTableUtils.addChatMessage(cm, false); if (cobj == null) { return; } // handle msgs object[] vs = new object[2]; vs[0] = cm; vs[1] = cobj; mPubSub.publish(HikePubSub.MESSAGE_RECEIVED, vs); // handle saving image object[] vals = new object[3]; vals[0] = groupId; vals[1] = fullViewImageBytes; vals[2] = thumbnailBytes; mPubSub.publish(HikePubSub.ADD_OR_UPDATE_PROFILE, vals); } else { MessageBox.Show(AppResources.CannotChangeGrpImg_Txt, AppResources.Something_Wrong_Txt, MessageBoxButton.OK); } //progressBar.IsEnabled = false; shellProgress.IsVisible = false; isProfilePicTapped = false; }); }
/* This function gets all the conversations shown on the message list page*/ public static List <ConversationListObject> getAllConversations() { byte[] data = null; List <ConversationListObject> convList = null; using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) { if (!store.DirectoryExists(CONVERSATIONS_DIRECTORY)) { return(null); } string[] files = store.GetFileNames(CONVERSATIONS_DIRECTORY + "\\*"); if (files == null || files.Length == 0) { return(null); } convList = new List <ConversationListObject>(files.Length); foreach (string fileName in files) { using (var file = store.OpenFile(CONVERSATIONS_DIRECTORY + "\\" + fileName, FileMode.Open, FileAccess.Read)) { using (var reader = new BinaryReader(file)) { ConversationListObject co = new ConversationListObject(); co.ReadVer_1_0_0_0(reader); if (IsValidConv(co)) { convList.Add(co); } } } } } convList.Sort(); return(convList); /* * using (HikeChatsDb context = new HikeChatsDb(App.MsgsDBConnectionstring+";Max Buffer Size=1024")) * { * var q = from o in DbCompiledQueries.chatsDbContext.conversations select o; * //var q = from o in DbCompiledQueries.chatsDbContext.conversations orderby o.TimeStamp descending select o; * return q.ToList(); * } * */ }
/// <summary> /// Single conv object is serialized to file /// </summary> /// <param name="obj"></param> public static void saveConvObject(ConversationListObject obj, string msisdn) { lock (readWriteLock) { string FileName = CONVERSATIONS_DIRECTORY + "\\" + msisdn; using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) // grab the storage { using (var file = store.OpenFile(FileName, FileMode.Create, FileAccess.Write)) { using (var writer = new BinaryWriter(file)) { writer.Seek(0, SeekOrigin.Begin); obj.Write(writer); } } } } }
public void onEventReceived(string type, object obj) { #region MESSAGE_RECEIVED if (HikePubSub.MESSAGE_RECEIVED == type) { Deployment.Current.Dispatcher.BeginInvoke(() => { object[] vals = (object[])obj; ConversationListObject mObj = (ConversationListObject)vals[1]; if (mObj == null) { return; } if (mObj.ConvBoxObj == null) { mObj.ConvBoxObj = new ConversationBox(mObj); if (App.ViewModel.ConversationListPage != null) { ContextMenuService.SetContextMenu(mObj.ConvBoxObj, App.ViewModel.ConversationListPage.createConversationContextMenu(mObj)); } } App.ViewModel.MessageListPageCollection.Remove(mObj.ConvBoxObj); App.ViewModel.ConvMap[mObj.Msisdn] = mObj; App.ViewModel.MessageListPageCollection.Insert(0, mObj.ConvBoxObj); }); } #endregion #region USER_LEFT USER_JOINED else if ((HikePubSub.USER_LEFT == type) || (HikePubSub.USER_JOINED == type)) { string msisdn = (string)obj; try { ConversationListObject convObj = App.ViewModel.ConvMap[msisdn]; convObj.IsOnhike = HikePubSub.USER_JOINED == type; } catch (KeyNotFoundException) { } } #endregion }
private void LoadMessages() { List <Conversation> conversationList = ConversationTableUtils.getAllConversations(); if (conversationList == null) { return; } for (int i = 0; i < conversationList.Count; i++) { Conversation conv = conversationList[i]; ConvMessage lastMessage = MessagesTableUtils.getLastMessageForMsisdn(conv.Msisdn); // why we are not getting only lastmsg as string ContactInfo contact = UsersTableUtils.getContactInfoFromMSISDN(conv.Msisdn); Thumbnails thumbnail = MiscDBUtil.getThumbNailForMSisdn(conv.Msisdn); ConversationListObject mObj = new ConversationListObject((contact == null) ? conv.Msisdn : contact.Msisdn, (contact == null) ? conv.Msisdn : contact.Name, lastMessage.Message, (contact == null) ? conv.OnHike : contact.OnHike, TimeUtils.getTimeString(lastMessage.Timestamp), thumbnail == null ? null : thumbnail.Avatar); convMap.Add(conv.Msisdn, mObj); App.ViewModel.MessageListPageCollection.Add(mObj); } }
private void MenuItem_Click_Delete(object sender, RoutedEventArgs e) { MessageBoxResult result = MessageBox.Show("Are you sure about deleting conversation.", "Delete Conversation ?", MessageBoxButton.OKCancel); if (result == MessageBoxResult.Cancel) { return; } ListBoxItem selectedListBoxItem = this.myListBox.ItemContainerGenerator.ContainerFromItem((sender as MenuItem).DataContext) as ListBoxItem; if (selectedListBoxItem == null) { return; } ConversationListObject convObj = selectedListBoxItem.DataContext as ConversationListObject; convMap.Remove(convObj.Msisdn); // removed entry from map App.ViewModel.MessageListPageCollection.Remove(convObj); // removed from observable collection ConversationTableUtils.deleteConversation(convObj.Msisdn); // removed entry from conversation table MessagesTableUtils.deleteAllMessagesForMsisdn(convObj.Msisdn); //removed all chat messages for this msisdn }
public static List <ConversationListObject> GetConvsFromIndividualFiles() { byte[] data = null; List <ConversationListObject> convList = null; using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) { if (!store.DirectoryExists(CONVERSATIONS_DIRECTORY)) { return(null); } string[] files = store.GetFileNames(CONVERSATIONS_DIRECTORY + "\\*"); if (files == null || files.Length == 0) { return(null); } convList = new List <ConversationListObject>(files.Length); foreach (string fileName in files) { if (fileName == "Convs" || fileName == "Convs_bkp" || fileName == "_Convs") { continue; } using (var file = store.OpenFile(CONVERSATIONS_DIRECTORY + "\\" + fileName, FileMode.Open, FileAccess.Read)) { using (var reader = new BinaryReader(file)) { ConversationListObject co = new ConversationListObject(); co.ReadVer_Latest(reader); // we know we have to read from latest file system if (IsValidConv(co)) { convList.Add(co); } } } } } convList.Sort(); return(convList); }
// this function will validate the conversation object public static bool IsValidConv(ConversationListObject item) { try { if (string.IsNullOrWhiteSpace(item.Msisdn)) { return(false); } else if (item.Msisdn == "+hike+") { return(true); } else if (item.Msisdn.Contains(":")) { double num; int idx = item.Msisdn.IndexOf(':'); if (idx > 0 && double.TryParse(item.Msisdn.Substring(idx + 1), out num)) { return(true); } return(false); } else if (item.Msisdn[0] == '+') { double num; if (double.TryParse(item.Msisdn.Substring(1), out num)) { return(true); } return(false); } return(false); } catch (Exception ex) { Debug.WriteLine("Exception while reading Conversations : {0}", ex.StackTrace); return(false); } }
public static void updateLastMsgStatus(long id, string msisdn, int status) { if (msisdn == null) { return; } ConversationListObject obj = null; if (App.ViewModel.ConvMap.ContainsKey(msisdn)) { obj = App.ViewModel.ConvMap[msisdn]; if (obj.LastMsgId != id) { return; } if (obj.MessageStatus != ConvMessage.State.UNKNOWN) // no D,R for notification msg so dont update { obj.MessageStatus = (ConvMessage.State)status; saveConvObject(obj, msisdn.Replace(":", "_")); //saveConvObjectList(); } } }
public static void saveNewConv(ConversationListObject obj) { int convs = 0; Stopwatch st = Stopwatch.StartNew(); Dictionary <string, ConversationListObject> convMap = App.ViewModel.ConvMap; lock (readWriteLock) { using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) // grab the storage { string FileName = CONVERSATIONS_DIRECTORY + "\\" + "_Convs"; using (var file = store.OpenFile(FileName, FileMode.Create, FileAccess.Write)) { using (var writer = new BinaryWriter(file)) { int count = (convMap == null ? 0 : convMap.Count) + 1; writer.Write(count); obj.Write(writer); if (convMap != null && convMap.Count > 0) { foreach (ConversationListObject item in convMap.Values) { item.Write(writer); convs++; } } } } store.DeleteFile(CONVERSATIONS_DIRECTORY + "\\" + "Convs"); store.MoveFile(CONVERSATIONS_DIRECTORY + "\\" + "_Convs", CONVERSATIONS_DIRECTORY + "\\" + "Convs"); } } st.Stop(); long mSec = st.ElapsedMilliseconds; Debug.WriteLine("Time to save {0} conversations : {1}", convs, mSec); }
public void onEventReceived(string type, object obj) { if (HikePubSub.MESSAGE_RECEIVED == type || HikePubSub.SEND_NEW_MSG == type) { ConvMessage convMessage = (ConvMessage)obj; ConversationListObject mObj; bool isNewConversation = false; /*This is used to avoid cross thread invokation exception*/ if (convMap.ContainsKey(convMessage.Msisdn)) { mObj = convMap[convMessage.Msisdn]; mObj.LastMessage = convMessage.Message; mObj.TimeStamp = TimeUtils.getTimeString(convMessage.Timestamp); Deployment.Current.Dispatcher.BeginInvoke(() => { App.ViewModel.MessageListPageCollection.Remove(mObj); }); } else { ContactInfo contact = UsersTableUtils.getContactInfoFromMSISDN(convMessage.Msisdn); Thumbnails thumbnail = MiscDBUtil.getThumbNailForMSisdn(convMessage.Msisdn); mObj = new ConversationListObject(convMessage.Msisdn, contact == null ? convMessage.Msisdn : contact.Name, convMessage.Message, contact == null ? !convMessage.IsSms : contact.OnHike, TimeUtils.getTimeString(convMessage.Timestamp), thumbnail == null ? null : thumbnail.Avatar); convMap.Add(convMessage.Msisdn, mObj); isNewConversation = true; } Deployment.Current.Dispatcher.BeginInvoke(() => { if (App.ViewModel.MessageListPageCollection == null) { App.ViewModel.MessageListPageCollection = new ObservableCollection <ConversationListObject>(); } App.ViewModel.MessageListPageCollection.Insert(0, mObj); }); object[] vals = new object[2]; vals[0] = convMessage; vals[1] = isNewConversation; if (HikePubSub.SEND_NEW_MSG == type) { mPubSub.publish(HikePubSub.MESSAGE_SENT, vals); } } else if (HikePubSub.MSG_READ == type) { string msisdn = (string)obj; try { ConversationListObject convObj = convMap[msisdn]; convObj.MessageStatus = ConvMessage.State.RECEIVED_READ; //TODO : update the UI here also. } catch (KeyNotFoundException) { } } else if ((HikePubSub.USER_LEFT == type) || (HikePubSub.USER_JOINED == type)) { string msisdn = (string)obj; try { ConversationListObject convObj = convMap[msisdn]; convObj.IsOnhike = HikePubSub.USER_JOINED == type; } catch (KeyNotFoundException) { } } else if (HikePubSub.UPDATE_UI == type) { string msisdn = (string)obj; try { ConversationListObject convObj = convMap[msisdn]; Deployment.Current.Dispatcher.BeginInvoke(() => { convObj.NotifyPropertyChanged("Msisdn"); }); } catch (KeyNotFoundException) { } } else if (HikePubSub.SMS_CREDIT_CHANGED == type) { Deployment.Current.Dispatcher.BeginInvoke(() => { creditsTxtBlck.Text = Convert.ToString((int)obj); }); } }
public static void LoadPendingRequests() { lock (pendingReadWriteLock) { using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) { if (!store.DirectoryExists(MISC_DIR)) { store.CreateDirectory(MISC_DIR); return; } string fname = MISC_DIR + "\\" + PENDING_REQ_FILE; if (!store.FileExists(fname)) { return; } using (var file = store.OpenFile(fname, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (var reader = new BinaryReader(file)) { int count = 0; try { count = reader.ReadInt32(); } catch { } if (count > 0) { for (int i = 0; i < count; i++) { ConversationListObject item = new ConversationListObject(); try { item.ReadFavOrPending(reader); if (App.ViewModel.ConvMap.ContainsKey(item.Msisdn)) { App.ViewModel.PendingRequests.Add(App.ViewModel.ConvMap[item.Msisdn]); } else { item.Avatar = MiscDBUtil.getThumbNailForMsisdn(item.Msisdn); App.ViewModel.PendingRequests.Add(item); } } catch { item = null; } } } reader.Close(); } try { file.Close(); file.Dispose(); } catch { } } } } }
public static ConversationListObject addConversation(ConvMessage convMessage, bool isNewGroup) { ConversationListObject obj = null; if (isNewGroup) { string groupName = convMessage.Msisdn; if (PhoneApplicationService.Current.State.ContainsKey(convMessage.Msisdn)) { groupName = (string)PhoneApplicationService.Current.State[convMessage.Msisdn]; PhoneApplicationService.Current.State.Remove(convMessage.Msisdn); } obj = new ConversationListObject(convMessage.Msisdn, groupName, convMessage.Message, true, convMessage.Timestamp, null, convMessage.MessageStatus, convMessage.MessageId); } else { ContactInfo contactInfo = UsersTableUtils.getContactInfoFromMSISDN(convMessage.Msisdn); byte[] avatar = MiscDBUtil.getThumbNailForMsisdn(convMessage.Msisdn); obj = new ConversationListObject(convMessage.Msisdn, contactInfo == null ? null : contactInfo.Name, convMessage.Message, contactInfo == null ? !convMessage.IsSms : contactInfo.OnHike, convMessage.Timestamp, avatar, convMessage.MessageStatus, convMessage.MessageId); if (App.ViewModel.Isfavourite(convMessage.Msisdn)) { obj.IsFav = true; } } /*If ABCD join grp chat convObj should show D joined grp chat as D is last in sorted order*/ if (convMessage.GrpParticipantState == ConvMessage.ParticipantInfoState.PARTICIPANT_JOINED) { obj.LastMessage = convMessage.Message; } else if (convMessage.GrpParticipantState == ConvMessage.ParticipantInfoState.USER_OPT_IN) { obj.LastMessage = obj.NameToShow + AppResources.USER_OPTED_IN_MSG; convMessage.Message = obj.LastMessage; } else if (convMessage.GrpParticipantState == ConvMessage.ParticipantInfoState.CREDITS_GAINED) { obj.LastMessage = convMessage.Message; } else if (convMessage.GrpParticipantState == ConvMessage.ParticipantInfoState.DND_USER) { obj.LastMessage = string.Format(AppResources.DND_USER, obj.NameToShow); convMessage.Message = obj.LastMessage; } else if (convMessage.GrpParticipantState == ConvMessage.ParticipantInfoState.USER_JOINED) { obj.LastMessage = string.Format(AppResources.USER_JOINED_HIKE, obj.NameToShow); convMessage.Message = obj.LastMessage; } Stopwatch st1 = Stopwatch.StartNew(); bool success = MessagesTableUtils.addMessage(convMessage); if (!success) { return(null); } obj.LastMsgId = convMessage.MessageId; st1.Stop(); long msec1 = st1.ElapsedMilliseconds; Debug.WriteLine("Time to add chat msg : {0}", msec1); Stopwatch st = Stopwatch.StartNew(); //saveNewConv(obj); saveConvObject(obj, obj.Msisdn.Replace(":", "_")); int convs = 0; App.appSettings.TryGetValue <int>(HikeViewModel.NUMBER_OF_CONVERSATIONS, out convs); App.WriteToIsoStorageSettings(HikeViewModel.NUMBER_OF_CONVERSATIONS, convs + 1); st.Stop(); long msec = st.ElapsedMilliseconds; Debug.WriteLine("Time to write conversation to iso storage {0}", msec); return(obj); }
public static void updateConversation(ConversationListObject obj) { saveConvObject(obj, obj.Msisdn.Replace(":", "_")); //saveConvObjectList(); }
public static ConversationListObject addChatMessage(ConvMessage convMsg, bool isNewGroup) { if (convMsg == null) { return(null); } ConversationListObject obj = null; if (!App.ViewModel.ConvMap.ContainsKey(convMsg.Msisdn)) { if (Utils.isGroupConversation(convMsg.Msisdn) && !isNewGroup) // if its a group chat msg and group does not exist , simply ignore msg. { return(null); } obj = ConversationTableUtils.addConversation(convMsg, isNewGroup); App.ViewModel.ConvMap.Add(convMsg.Msisdn, obj); } else { obj = App.ViewModel.ConvMap[convMsg.Msisdn]; #region PARTICIPANT_JOINED if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.PARTICIPANT_JOINED) { obj.LastMessage = convMsg.Message; GroupInfo gi = GroupTableUtils.getGroupInfoForId(convMsg.Msisdn); if (gi == null) { return(null); } if (string.IsNullOrEmpty(gi.GroupName)) // no group name is set { obj.ContactName = GroupManager.Instance.defaultGroupName(convMsg.Msisdn); } } #endregion #region PARTICIPANT_LEFT else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.PARTICIPANT_LEFT || convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.INTERNATIONAL_GROUP_USER) { obj.LastMessage = convMsg.Message; GroupInfo gi = GroupTableUtils.getGroupInfoForId(convMsg.Msisdn); if (gi == null) { return(null); } if (string.IsNullOrEmpty(gi.GroupName)) // no group name is set { obj.ContactName = GroupManager.Instance.defaultGroupName(convMsg.Msisdn); } } #endregion #region GROUP_JOINED_OR_WAITING else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.GROUP_JOINED_OR_WAITING) // shows invite msg { string[] vals = Utils.splitUserJoinedMessage(convMsg.Message); List <string> waitingParticipants = null; for (int i = 0; i < vals.Length; i++) { string[] vars = vals[i].Split(HikeConstants.DELIMITERS, StringSplitOptions.RemoveEmptyEntries); // msisdn:0 or msisdn:1 // every participant is either on DND or not on DND GroupParticipant gp = GroupManager.Instance.getGroupParticipant(null, vars[0], convMsg.Msisdn); if (vars[1] == "0") // DND USER and not OPTED IN { if (waitingParticipants == null) { waitingParticipants = new List <string>(); } waitingParticipants.Add(gp.FirstName); } } if (waitingParticipants != null && waitingParticipants.Count > 0) // show waiting msg { StringBuilder msgText = new StringBuilder(); if (waitingParticipants.Count == 1) { msgText.Append(waitingParticipants[0]); } else if (waitingParticipants.Count == 2) { msgText.Append(waitingParticipants[0] + AppResources.And_txt + waitingParticipants[1]); } else { for (int i = 0; i < waitingParticipants.Count; i++) { msgText.Append(waitingParticipants[0]); if (i == waitingParticipants.Count - 2) { msgText.Append(AppResources.And_txt); } else if (i < waitingParticipants.Count - 2) { msgText.Append(","); } } } obj.LastMessage = string.Format(AppResources.WAITING_TO_JOIN, msgText.ToString()); } else { string[] vars = vals[vals.Length - 1].Split(':'); GroupParticipant gp = GroupManager.Instance.getGroupParticipant(null, vars[0], convMsg.Msisdn); string text = AppResources.USER_JOINED_GROUP_CHAT; obj.LastMessage = gp.FirstName + text; } } #endregion #region USER_OPT_IN else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.USER_OPT_IN) { if (Utils.isGroupConversation(obj.Msisdn)) { GroupParticipant gp = GroupManager.Instance.getGroupParticipant(null, convMsg.Message, obj.Msisdn); obj.LastMessage = gp.FirstName + AppResources.USER_JOINED_GROUP_CHAT; } else { obj.LastMessage = obj.NameToShow + AppResources.USER_OPTED_IN_MSG; } convMsg.Message = obj.LastMessage; } #endregion #region CREDITS_GAINED else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.CREDITS_GAINED) { obj.LastMessage = convMsg.Message; } #endregion #region DND_USER else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.DND_USER) { obj.LastMessage = string.Format(AppResources.DND_USER, obj.NameToShow); convMsg.Message = obj.LastMessage; } #endregion #region USER_JOINED else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.USER_JOINED) { if (Utils.isGroupConversation(obj.Msisdn)) { GroupParticipant gp = GroupManager.Instance.getGroupParticipant(null, convMsg.Message, obj.Msisdn); obj.LastMessage = string.Format(AppResources.USER_JOINED_HIKE, gp.FirstName); } else // 1-1 chat { obj.LastMessage = string.Format(AppResources.USER_JOINED_HIKE, obj.NameToShow); } convMsg.Message = obj.LastMessage; } #endregion \ #region GROUP NAME/PIC CHANGED else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.GROUP_NAME_CHANGE || convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.GROUP_PIC_CHANGED) { obj.LastMessage = convMsg.Message; } #endregion #region NO_INFO else if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.NO_INFO) { //convMsg.GroupParticipant is null means message sent by urself if (convMsg.GroupParticipant != null && Utils.isGroupConversation(convMsg.Msisdn)) { GroupParticipant gp = GroupManager.Instance.getGroupParticipant(null, convMsg.GroupParticipant, convMsg.Msisdn); obj.LastMessage = gp != null ? (gp.FirstName + "- " + convMsg.Message) : convMsg.Message; } else { obj.LastMessage = convMsg.Message; } } #endregion #region OTHER MSGS else { obj.LastMessage = convMsg.Message; } #endregion Stopwatch st1 = Stopwatch.StartNew(); bool success = addMessage(convMsg); if (!success) { return(null); } st1.Stop(); long msec1 = st1.ElapsedMilliseconds; Debug.WriteLine("Time to add chat msg : {0}", msec1); obj.MessageStatus = convMsg.MessageStatus; obj.TimeStamp = convMsg.Timestamp; obj.LastMsgId = convMsg.MessageId; Stopwatch st = Stopwatch.StartNew(); ConversationTableUtils.updateConversation(obj); st.Stop(); long msec = st.ElapsedMilliseconds; Debug.WriteLine("Time to update conversation : {0}", msec); } return(obj); }
// this is called in case of gcj from Network manager public static ConversationListObject addGroupChatMessage(ConvMessage convMsg, JObject jsonObj) { ConversationListObject obj = null; if (!App.ViewModel.ConvMap.ContainsKey(convMsg.Msisdn)) // represents group is new { bool success = addMessage(convMsg); if (!success) { return(null); } string groupName = GroupManager.Instance.defaultGroupName(convMsg.Msisdn); obj = ConversationTableUtils.addGroupConversation(convMsg, groupName); App.ViewModel.ConvMap[convMsg.Msisdn] = obj; GroupInfo gi = new GroupInfo(convMsg.Msisdn, null, convMsg.GroupParticipant, true); GroupTableUtils.addGroupInfo(gi); } else // add a member to a group { List <GroupParticipant> existingMembers = null; GroupManager.Instance.GroupCache.TryGetValue(convMsg.Msisdn, out existingMembers); if (existingMembers == null) { return(null); } obj = App.ViewModel.ConvMap[convMsg.Msisdn]; GroupInfo gi = GroupTableUtils.getGroupInfoForId(convMsg.Msisdn); if (string.IsNullOrEmpty(gi.GroupName)) // no group name is set { obj.ContactName = GroupManager.Instance.defaultGroupName(obj.Msisdn); } if (convMsg.GrpParticipantState == ConvMessage.ParticipantInfoState.MEMBERS_JOINED) { string[] vals = convMsg.Message.Split(';'); if (vals.Length == 2) { obj.LastMessage = vals[1]; } else { obj.LastMessage = convMsg.Message; } } else { obj.LastMessage = convMsg.Message; } bool success = addMessage(convMsg); if (!success) { return(null); } obj.MessageStatus = convMsg.MessageStatus; obj.TimeStamp = convMsg.Timestamp; obj.LastMsgId = convMsg.MessageId; ConversationTableUtils.updateConversation(obj); } return(obj); }
public static List <ContactInfo> getContactList(JObject obj, Dictionary <string, List <ContactInfo> > new_contacts_by_id, bool isRefresh) { try { if ((obj == null) || HikeConstants.FAIL == (string)obj[HikeConstants.STAT]) { return(null); } JObject addressbook = (JObject)obj["addressbook"]; if (addressbook == null || new_contacts_by_id == null || new_contacts_by_id.Count == 0) { return(null); } bool isFavSaved = false; bool isPendingSaved = false; int hikeCount = 1, smsCount = 1; List <ContactInfo> msgToShow = null; List <string> msisdns = null; Dictionary <string, GroupInfo> allGroupsInfo = null; if (!isRefresh) { msgToShow = new List <ContactInfo>(5); msisdns = new List <string>(); } else // if refresh case load groups in cache { GroupManager.Instance.LoadGroupCache(); List <GroupInfo> gl = GroupTableUtils.GetAllGroups(); for (int i = 0; i < gl.Count; i++) { if (allGroupsInfo == null) { allGroupsInfo = new Dictionary <string, GroupInfo>(); } allGroupsInfo[gl[i].GroupId] = gl[i]; } } List <ContactInfo> server_contacts = new List <ContactInfo>(); IEnumerator <KeyValuePair <string, JToken> > keyVals = addressbook.GetEnumerator(); KeyValuePair <string, JToken> kv; int count = 0; int totalContacts = 0; while (keyVals.MoveNext()) { try { kv = keyVals.Current; JArray entries = (JArray)addressbook[kv.Key]; List <ContactInfo> cList = new_contacts_by_id[kv.Key]; for (int i = 0; i < entries.Count; ++i) { JObject entry = (JObject)entries[i]; string msisdn = (string)entry["msisdn"]; if (string.IsNullOrWhiteSpace(msisdn)) { count++; continue; } bool onhike = (bool)entry["onhike"]; ContactInfo cinfo = cList[i]; ContactInfo cn = new ContactInfo(kv.Key, msisdn, cinfo.Name, onhike, cinfo.PhoneNo); if (!isRefresh) // this is case for new installation { if (cn.Msisdn != (string)App.appSettings[App.MSISDN_SETTING]) // do not add own number { if (onhike && hikeCount <= 3 && !msisdns.Contains(cn.Msisdn)) { msisdns.Add(cn.Msisdn); msgToShow.Add(cn); hikeCount++; } if (!onhike && smsCount <= 2 && cn.Msisdn.StartsWith("+91") && !msisdns.Contains(cn.Msisdn)) // allow only indian numbers for sms { msisdns.Add(cn.Msisdn); msgToShow.Add(cn); smsCount++; } } } else // this is refresh contacts case { if (App.ViewModel.ConvMap.ContainsKey(cn.Msisdn)) // update convlist { try { App.ViewModel.ConvMap[cn.Msisdn].ContactName = cn.Name; } catch (Exception e) { Debug.WriteLine("REFRESH CONTACTS :: Update contact exception " + e.StackTrace); } } else // fav and pending case { ConversationListObject c = App.ViewModel.GetFav(cn.Msisdn); if (c != null) // this user is in favs { c.ContactName = cn.Name; MiscDBUtil.SaveFavourites(c); isFavSaved = true; } else { c = App.ViewModel.GetPending(cn.Msisdn); if (c != null) { c.ContactName = cn.Name; isPendingSaved = true; } } } GroupManager.Instance.RefreshGroupCache(cn, allGroupsInfo); } server_contacts.Add(cn); totalContacts++; } } catch (Exception ex) { Debug.WriteLine("AccountUtils : getContactList : Exception : " + ex.StackTrace); } } if (isFavSaved) { MiscDBUtil.SaveFavourites(); } if (isPendingSaved) { MiscDBUtil.SavePendingRequests(); } msisdns = null; Debug.WriteLine("Total contacts with no msisdn : {0}", count); Debug.WriteLine("Total contacts inserted : {0}", totalContacts); if (!isRefresh) { App.WriteToIsoStorageSettings(HikeConstants.AppSettings.CONTACTS_TO_SHOW, msgToShow); } return(server_contacts); } catch (ArgumentException) { return(null); } catch (Exception e) { return(null); } }
private void Invite_Or_Fav_Click(object sender, EventArgs e) { #region FAV SECTION if (_isAddToFavPage) { bool isPendingRemoved = false; for (int i = 0; i < (hikeFavList == null ? 0 : hikeFavList.Count); i++) { if (!App.ViewModel.Isfavourite(hikeFavList[i].Msisdn) && hikeFavList[i].Msisdn != App.MSISDN) // if not already favourite then only add to fav { ConversationListObject favObj = null; if (App.ViewModel.ConvMap.ContainsKey(hikeFavList[i].Msisdn)) { favObj = App.ViewModel.ConvMap[hikeFavList[i].Msisdn]; favObj.IsFav = true; } else { favObj = new ConversationListObject(hikeFavList[i].Msisdn, hikeFavList[i].Name, hikeFavList[i].OnHike, hikeFavList[i].Avatar); } App.ViewModel.FavList.Insert(0, favObj); if (App.ViewModel.IsPending(favObj.Msisdn)) // if this is in pending already , remove from pending and add to fav { App.ViewModel.PendingRequests.Remove(favObj); isPendingRemoved = true; } int count = 0; App.appSettings.TryGetValue <int>(HikeViewModel.NUMBER_OF_FAVS, out count); App.WriteToIsoStorageSettings(HikeViewModel.NUMBER_OF_FAVS, count + 1); JObject data = new JObject(); data["id"] = hikeFavList[i].Msisdn; JObject obj = new JObject(); obj[HikeConstants.TYPE] = HikeConstants.MqttMessageTypes.ADD_FAVOURITE; obj[HikeConstants.DATA] = data; App.HikePubSubInstance.publish(HikePubSub.MQTT_PUBLISH, obj); MiscDBUtil.SaveFavourites(favObj); App.AnalyticsInstance.addEvent(Analytics.ADD_FAVS_INVITE_USERS); } } MiscDBUtil.SaveFavourites(); if (isPendingRemoved) { MiscDBUtil.SavePendingRequests(); } App.HikePubSubInstance.publish(HikePubSub.ADD_REMOVE_FAV_OR_PENDING, null); } #endregion #region INVITE else { string inviteToken = ""; //App.appSettings.TryGetValue<string>(HikeConstants.INVITE_TOKEN, out inviteToken); int count = 0; foreach (string key in contactsList.Keys) { if (key == App.MSISDN) { continue; } JObject obj = new JObject(); JObject data = new JObject(); data[HikeConstants.SMS_MESSAGE] = string.Format(AppResources.sms_invite_message, inviteToken); data[HikeConstants.TIMESTAMP] = TimeUtils.getCurrentTimeStamp(); data[HikeConstants.MESSAGE_ID] = -1; obj[HikeConstants.TO] = key; obj[HikeConstants.DATA] = data; obj[HikeConstants.TYPE] = NetworkManager.INVITE; App.MqttManagerInstance.mqttPublishToServer(obj); count++; } if (count > 0) { MessageBox.Show(string.Format(AppResources.InviteUsers_TotalInvitesSent_Txt, count), AppResources.InviteUsers_FriendsInvited_Txt, MessageBoxButton.OK); } } #endregion NavigationService.GoBack(); }
/// <summary> /// this function will automatically read which read function version should be used to read file /// </summary> /// <returns></returns> public static List <ConversationListObject> getAllConvs() { List <ConversationListObject> convList = null; // when reading a file , nobody should write it lock (readWriteLock) { using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication()) { if (!store.DirectoryExists(CONVERSATIONS_DIRECTORY)) { return(null); } string fname; if (store.FileExists(CONVERSATIONS_DIRECTORY + "\\" + "Convs")) { fname = CONVERSATIONS_DIRECTORY + "\\" + "Convs"; } else if (store.FileExists(CONVERSATIONS_DIRECTORY + "\\" + "Convs_bkp")) { fname = CONVERSATIONS_DIRECTORY + "\\" + "Convs_bkp"; } else { return(null); } using (var file = store.OpenFile(fname, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (var reader = new BinaryReader(file)) { int count = 0; try { count = reader.ReadInt32(); } catch { } if (count > 0) { bool isLessThanEqualTo_1500 = false; if (Utils.compareVersion(App.CURRENT_VERSION, "1.5.0.0") != 1) // current_ver <= 1.5.0.0 { isLessThanEqualTo_1500 = true; } convList = new List <ConversationListObject>(count); for (int i = 0; i < count; i++) { ConversationListObject item = new ConversationListObject(); try { if (isLessThanEqualTo_1500) { item.ReadVer_1_4_0_0(reader); } else { item.ReadVer_Latest(reader); } } catch { item = null; } if (IsValidConv(item)) { convList.Add(item); } } convList.Sort(); } reader.Close(); } try { file.Close(); file.Dispose(); } catch { } } store.Dispose(); } return(convList); } }