public async void childAdded(DataSnapshot snapshot, string previousChildName)
        {
            // Card metadata
            string fromUserID = (string)snapshot.Child("FromUserID").GetValue(true);
            string cardID     = (string)snapshot.Child("CardID").GetValue(true);
            string mediaNames = (string)snapshot.Child("MediaNames").GetValue(true);
            string cardName   = (string)snapshot.Child("Name").GetValue(true);

            //Ask user if accept card
            if (await AcrDialogUtilities
                .promptConfirm("Do you want to accept a card from " + fromUserID + "?"))
            {
                downloadCard(fromUserID, cardID, mediaNames, cardName);
            }
        }
        /// <summary>
        /// Listen to OtherCards database for new shared cards
        /// </summary>
        public async void initialize()
        {
            string userID = await AcrDialogUtilities.promptInput("Input User ID");

            if (userID == "")
            {
                return;
            }

            // FirebaseDatabase - get cards shared with userID
            FirebaseDatabase  database            = FirebaseDatabase.Instance;
            DatabaseReference dr_userCardListItem = database.GetReference("Users").Child(userID).Child("OthersCards");

            Query sharedCardsQuery = dr_userCardListItem.LimitToFirst(100);

            sharedCardsQuery.AddChildEventListener(new FirebaseChildListener(this));
        }
        public async void uploadCard(Card card)
        {
            // TODO HARDCODED USER ID
            string userID = await AcrDialogUtilities.promptInput("Input User ID");

            string sendToUserID = await AcrDialogUtilities.promptInput("Input Share to User ID");

            if (userID == "" || sendToUserID == "")
            {
                return;
            }

            // FirebaseDatabase - Update userID with card
            FirebaseDatabase  database   = FirebaseDatabase.Instance;
            DatabaseReference dr_curUser = database.GetReference("Users").Child(userID);

            DatabaseReference dr_curUserCards = dr_curUser.Child("MyCards");
            DatabaseReference dr_curCard      = dr_curUserCards.Push(); // Unique card ID generated

            dr_curCard.Child("Name").SetValue(card.name);
            dr_curCard.Child("UploadFinished").SetValue(false);
            dr_curCard.Child("MediaNames").SetValue(stringifyCardMediaNames(card));

            // FirebaseDatabase - Update sendToUserID with card
            DatabaseReference dr_userCardListItem = database.GetReference("Users").Child(sendToUserID).Child("OthersCards").Push();

            dr_userCardListItem.Child("FromUserID").SetValue(userID);
            dr_userCardListItem.Child("CardID").SetValue(dr_curCard.Key);
            dr_userCardListItem.Child("MediaNames").SetValue(stringifyCardMediaNames(card));
            dr_userCardListItem.Child("Name").SetValue(card.name);

            // FirebaseStorage - Store card
            FirebaseStorage  storage = FirebaseStorage.Instance;
            StorageReference sr_cud  = storage.GetReference("Users").Child(userID);

            StorageReference sr_curCard    = sr_cud.Child(dr_curCard.Key); // Use unique card ID
            StorageReference sr_cardMedias = sr_curCard.Child("Media");

            uploadCardMedia(sr_cardMedias, card);

            // Mark upload finished
            dr_curCard.Child("UploadFinished").SetValue(true);
        }