protected override void OnCreate (Bundle bundle)
		{
			base.OnCreate (bundle);
			chatroom = DatabaseAccessors.ChatRoomDatabaseAccessor.GetChatRoom (Intent.GetStringExtra ("chatroom"));
			SetContentView (Resource.Layout.ChatRoom);
			chatsAdapter = new ChatAdapter (this);
			var chatsListView = FindViewById<ListView> (Resource.Id.chatsListView);
			chatsListView.Adapter = chatsAdapter;
			chatsListView.ItemClick += (object sender, AdapterView.ItemClickEventArgs e) => {

			};

			var sendButton = FindViewById<Button> (Resource.Id.send_message_button);
			var textBoxEdit = FindViewById<EditText> (Resource.Id.chatInputTextBox);
			textBoxEdit.Click += (sender, e) => {
				RunOnUiThread( () => FindViewById<ListView>(Resource.Id.chatsListView).SmoothScrollToPosition(chatsAdapter.GetCount() - 1));
			};
			sendButton.Click += async (sender, e) => {
				EditText textEdit = FindViewById<EditText>(Resource.Id.chatInputTextBox);
				string messageContent = textEdit.Text.ToString();
				RunOnUiThread( () => textEdit.Text = "");
				ParseChatItemDatabase parseItemDB = new ParseChatItemDatabase();
				ChatItem chat = new ChatItem();
				chat.chatroomID = chatroom.webID;
				chat.senderID = DatabaseAccessors.CurrentUser().webID;
				chat.content = messageContent;

				await parseItemDB.SaveChatItemAsync(chat);
				DatabaseAccessors.ChatDatabaseAccessor.SaveItem(chat);
				RunOnUiThread(() => chatsAdapter.NotifyDataSetChanged());
				RunOnUiThread( () => FindViewById<ListView>(Resource.Id.chatsListView).SmoothScrollToPosition(chatsAdapter.GetCount() - 1));

				var push = new ParsePush();
				push.Channels = new List<string> {chatroom.webID};
				push.Alert = "Your men might be requesting help!";
				await push.SendAsync();
			};

			Task getUpdatedInfo = new Task (async () => {
				await SynchronizeWithParse ();
			});

			ParsePush.ParsePushNotificationReceived += async (sender, args) => {
				Console.WriteLine("push");
				await SynchronizeWithParse();
			};

			getUpdatedInfo.Start ();
		}
		protected override void OnCreate (Bundle bundle)
		{
			base.OnCreate (bundle);
			SetContentView (Resource.Layout.Contacts);
			Button searchContactsBtn = FindViewById<Button> (Resource.Id.search_contacts);
			searchContactsBtn.Click += async (sender, e) =>  {
				GetParseUsers();
				contactsAdapter = new ContactsAdapter (this);
				var contactsListView = FindViewById<ListView> (Resource.Id.contactsListView);
				contactsListView.Adapter = contactsAdapter;	
				contactsListView.ItemClick += async (object sender2, AdapterView.ItemClickEventArgs e2) => {
					User curritem = contactsAdapter.GetUserAt(e2.Position);
					ParseChatRoomDatabase pcrd = new ParseChatRoomDatabase();
					ChatRoom newchatroom = new ChatRoom();
					await pcrd.SaveChatRoomAsync(newchatroom);
					DatabaseAccessors.ChatRoomDatabaseAccessor.SaveChatRoom(newchatroom);
					List<User> chatroomUsers = new List<User>();
					chatroomUsers.Add(curritem);
					chatroomUsers.Add(DatabaseAccessors.CurrentUser());
					DatabaseAccessors.ChatRoomDatabaseAccessor.SaveChatRoomUsers(chatroomUsers, newchatroom);
					var crus = DatabaseAccessors.ChatRoomDatabaseAccessor.GetChatRoomUsers(newchatroom.webID);
					foreach(ChatRoomUser cru in crus){
						await pcrd.SaveChatRoomUsersAsync(cru);
						var push = new ParsePush();
						push.Channels = new List<string> {cru.userID};
						push.Alert = "Your men might be requesting help!";
						await push.SendAsync();
					}
					ChatsActivity.NotifyChatRoomsUpdate();

					var intent = new Intent(this, typeof(ChatRoomActivity));
					intent.PutExtra("chatroom", newchatroom.webID);
					StartActivity(intent);

					this.Finish();
				};
			};



		}
 public void SaveChatRoomUsers(List<User> users, ChatRoom chatroom)
 {
     lock (chatroomUserLocker) {
         foreach (User user in users) {
             ChatRoomUser cru = new ChatRoomUser ();
             cru.chatRoomID = chatroom.webID;
             cru.userID = user.webID;
             chatroomUserDatabase.Insert (cru);
         }
     }
 }
        public string SaveChatRoom(ChatRoom chatroom)
        {
            lock (locker) {
                database.Insert (chatroom);
                return chatroom.webID;

            }
        }
		public async Task GetAndSyncChatRoomsAsync(){
			var query = ParseObject.GetQuery ("ChatRoomUser").WhereEqualTo ("userId", ParseUser.CurrentUser.ObjectId).Select("chatroomId");
			IEnumerable<ParseObject> chatRoomIds = await query.FindAsync();
			List<ParseObject> results = new List<ParseObject> ();
			foreach(ParseObject crpo in chatRoomIds){
				var currCRUQuery = ParseObject.GetQuery ("ChatRoomUser").WhereEqualTo ("chatroomId", crpo ["chatroomId"]);
				foreach (ParseObject cruPO in await currCRUQuery.FindAsync()) {
					results.Add (cruPO);
				}
			}
			List<ChatRoomUser> crusToAdd = new List<ChatRoomUser> ();
			List<String> crToAdd = new List<String> ();
			List<String> usersToAdd = new List<String> ();
			foreach (var cruPO in results) {
				ChatRoomUser cru = FromParseObjectChatRoomUser (cruPO);
				if (DatabaseAccessors.ChatRoomDatabaseAccessor.ExistsChatRoomUser (cru.chatRoomID, cru.userID) == false)
					crusToAdd.Add (cru);
				if (DatabaseAccessors.ChatRoomDatabaseAccessor.ExistsChatRoom (cru.chatRoomID) == false && crToAdd.Contains (cru.chatRoomID) == false)
					crToAdd.Add (cru.chatRoomID);
				if (DatabaseAccessors.UserDatabaseAccessor.ExistsUser (cru.userID) == false && usersToAdd.Contains(cru.userID) == false)
					usersToAdd.Add (cru.userID);
			}
			foreach (string userId in usersToAdd) {
				User newUser = new User ();
				var userQuery = ParseObject.GetQuery ("UserInformation").WhereEqualTo ("userId", userId);
				ParseObject userPO = await userQuery.FirstAsync ();
				newUser.name = (string)userPO ["fullName"];
				newUser.webID = userId;
				DatabaseAccessors.UserDatabaseAccessor.SaveUser (newUser);
			}

			foreach (string crid in crToAdd) {
				ChatRoom currChatRoom = new ChatRoom ();
				currChatRoom.webID = crid;
				DatabaseAccessors.ChatRoomDatabaseAccessor.SaveChatRoom (currChatRoom);
			}


			foreach (ChatRoomUser cru in crusToAdd) {
				User currUser = DatabaseAccessors.UserDatabaseAccessor.GetUser (cru.userID);
				List<User> currUserAsList = new List<User> ();
				currUserAsList.Add (currUser);
				ChatRoom chatroom = DatabaseAccessors.ChatRoomDatabaseAccessor.GetChatRoom (cru.chatRoomID);
				DatabaseAccessors.ChatRoomDatabaseAccessor.SaveChatRoomUsers (currUserAsList, chatroom);
			}

		}
		public async Task SaveChatRoomAsync(ChatRoom chatroom)
		{
			ParseObject po = ToParseObject (chatroom);
			await po.SaveAsync ();
			chatroom.webID = po.ObjectId;
		}
		static ChatRoom FromParseObject (ParseObject po)
		{
			var t = new ChatRoom ();
			t.webID = po.ObjectId;
			return t;
		}
		ParseObject ToParseObject (ChatRoom chatroom)
		{
			var po = new ParseObject("ChatRoom");

			return po;
		}
 public ChatAdapter(Activity activity)
 {
     _activity = activity;
     chatroom = ((ChatRoomActivity)activity).ChatRoomAccessor;
     FillMessages ();
 }
        public async Task GetAndSyncChatRoomsAsync()
        {
            var query = ParseObject.GetQuery("ChatRoomUser").WhereEqualTo("userId", ParseUser.CurrentUser.ObjectId).Select("chatroomId");
            IEnumerable <ParseObject> chatRoomIds = await query.FindAsync();

            List <ParseObject> results = new List <ParseObject> ();

            foreach (ParseObject crpo in chatRoomIds)
            {
                var currCRUQuery = ParseObject.GetQuery("ChatRoomUser").WhereEqualTo("chatroomId", crpo ["chatroomId"]);
                foreach (ParseObject cruPO in await currCRUQuery.FindAsync())
                {
                    results.Add(cruPO);
                }
            }
            List <ChatRoomUser> crusToAdd  = new List <ChatRoomUser> ();
            List <String>       crToAdd    = new List <String> ();
            List <String>       usersToAdd = new List <String> ();

            foreach (var cruPO in results)
            {
                ChatRoomUser cru = FromParseObjectChatRoomUser(cruPO);
                if (DatabaseAccessors.ChatRoomDatabaseAccessor.ExistsChatRoomUser(cru.chatRoomID, cru.userID) == false)
                {
                    crusToAdd.Add(cru);
                }
                if (DatabaseAccessors.ChatRoomDatabaseAccessor.ExistsChatRoom(cru.chatRoomID) == false && crToAdd.Contains(cru.chatRoomID) == false)
                {
                    crToAdd.Add(cru.chatRoomID);
                }
                if (DatabaseAccessors.UserDatabaseAccessor.ExistsUser(cru.userID) == false && usersToAdd.Contains(cru.userID) == false)
                {
                    usersToAdd.Add(cru.userID);
                }
            }
            foreach (string userId in usersToAdd)
            {
                User        newUser   = new User();
                var         userQuery = ParseObject.GetQuery("UserInformation").WhereEqualTo("userId", userId);
                ParseObject userPO    = await userQuery.FirstAsync();

                newUser.name  = (string)userPO ["fullName"];
                newUser.webID = userId;
                DatabaseAccessors.UserDatabaseAccessor.SaveUser(newUser);
            }

            foreach (string crid in crToAdd)
            {
                ChatRoom currChatRoom = new ChatRoom();
                currChatRoom.webID = crid;
                DatabaseAccessors.ChatRoomDatabaseAccessor.SaveChatRoom(currChatRoom);
            }


            foreach (ChatRoomUser cru in crusToAdd)
            {
                User        currUser       = DatabaseAccessors.UserDatabaseAccessor.GetUser(cru.userID);
                List <User> currUserAsList = new List <User> ();
                currUserAsList.Add(currUser);
                ChatRoom chatroom = DatabaseAccessors.ChatRoomDatabaseAccessor.GetChatRoom(cru.chatRoomID);
                DatabaseAccessors.ChatRoomDatabaseAccessor.SaveChatRoomUsers(currUserAsList, chatroom);
            }
        }
        ParseObject ToParseObject(ChatRoom chatroom)
        {
            var po = new ParseObject("ChatRoom");

            return(po);
        }