Beispiel #1
0
    private void OnUserLoginClick(Face f, GameObject panelInstance)
    {
        CloudUserData userData = CloudUserData.Instance;

        if (userData)
        {
            userData.selectedUser = f;
        }

        // SetHintText("Selected: " + (userData ? userData.selectedUser.candidate.person.name : "-"));

        CloudUserManager userManager      = CloudUserManager.Instance;
        CloudFaceManager cloudFaceManager = CloudFaceManager.Instance;
        Person           person           = userData.selectedUser.candidate.person;
        StringBuilder    sbPerson         = new StringBuilder();
        CultureInfo      culture          = new CultureInfo("en-US");

        string groupId = userManager ? userManager.userGroupId : "";
        string checkIn = System.DateTime.Now.ToString("g", culture);         // Timestamp on "Check In" Press

        person.userData += string.Format("|CheckIn={0}", checkIn);
        cloudFaceManager.UpdatePersonData(groupId, person);

        sbPerson.Append(person.name).AppendLine()
        .AppendLine(person.userData).AppendLine()
        .AppendLine("Person Updated in Cloud").AppendLine();

        Debug.Log(sbPerson.ToString());
        panelInstance.gameObject.SetActive(false);
        SetHintText(string.Format("{0} Checked In", person.name));

        // load the main scene
        // SceneManager.LoadScene(1);
    }
Beispiel #2
0
    private IEnumerator UpdatePerson(Person p, string name, string userData)
    {
        modalPanel.ShowProgress("Saving data, Please Wait ...");

        AsyncTask <bool> task = new AsyncTask <bool>(() =>
        {
            try
            {
                // update data in the cloud
                CloudUserManager groupMgr = CloudUserManager.Instance;

                if (groupMgr != null && p != null)
                {
                    p.name     = name;
                    p.userData = userData;
                    groupMgr.UpdateUserData(p);

                    return(true);
                }

                return(false);
            }
            catch (Exception ex)
            {
                Debug.LogError("Failed to process task: " + ex.Message + "\n" + ex.StackTrace);
                return(false);
            }
        });

        task.Start();
        yield return(null);

        while (task.State == TaskState.Running)
        {
            yield return(null);
        }

        modalPanel.Hide();

        if (!task.Result)
        {
            modalPanel.ShowMessage("Error saving data!");
        }
        else
        {
            HidePersonDetails();

            if (p != null)
            {
                GameObject personPanelInstance = personsPanels[p.personId];
                Text       personName          = personPanelInstance.GetComponentInChildren <Text>();
                personName.text = name;
            }
        }

        yield return(null);
    }
    void Start()
    {
        try
        {
            instance = this;

            if (string.IsNullOrEmpty(userGroupId))
            {
                throw new Exception("Please set the user-group name.");
            }

            faceManager = CloudFaceManager.Instance;
            if (faceManager != null)
            {
                if (string.IsNullOrEmpty(faceManager.faceSubscriptionKey))
                {
                    throw new Exception("Please set your face-subscription key.");
                }
            }
            else
            {
                throw new Exception("FaceManager-component not found.");
            }

            // get the user group info
            if (checkGroupAtStart)
            {
                AsyncTask <bool> task = new AsyncTask <bool>(() => {
                    GetOrGreateUserGroup();
                    return(userGroupId == initedGroupId);
                });

                task.Start();

                int waitounter = threadWaitLoops;
                while (task.State == TaskState.Running && waitounter > 0)
                {
                    Thread.Sleep(threadWaitMs);
                    waitounter--;
                }

                if (!string.IsNullOrEmpty(task.ErrorMessage))
                {
                    throw new Exception(task.ErrorMessage);
                }
            }
        }
        catch (Exception ex)
        {
            Debug.LogError(ex.Message + '\n' + ex.StackTrace);

            if (debugText != null)
            {
                debugText.text = ex.Message;
            }
        }
    }
Beispiel #4
0
    private IEnumerator DeletePerson(Person p)
    {
        modalPanel.ShowProgress("Deleting user, Please Wait ...");

        AsyncTask <bool> task = new AsyncTask <bool>(() =>
        {
            try
            {
                // update data in the cloud
                CloudUserManager groupMgr = CloudUserManager.Instance;

                if (groupMgr != null && p != null && persons != null)
                {
                    groupMgr.DeleteUser(p);
                    return(true);
                }

                return(false);
            }
            catch (Exception ex)
            {
                Debug.LogError("Failed to process task: " + ex.Message + "\n" + ex.StackTrace);
                return(false);
            }
        });

        task.Start();
        yield return(null);

        while (task.State == TaskState.Running)
        {
            yield return(null);
        }

        modalPanel.Hide();

        if (!task.Result)
        {
            modalPanel.ShowMessage("Error deleting user!");
        }
        else
        {
            HidePersonDetails();

            if (p != null)
            {
                persons.Remove(p);

                GameObject personPanelInstance = personsPanels[p.personId];
                DestroyPersonPanel(personPanelInstance);
                personsPanels.Remove(p.personId);
            }
        }

        yield return(null);
    }
Beispiel #5
0
    private IEnumerator CreatePerson(string name)
    {
        modalPanel.ShowProgress("Saving data, Please Wait ...");
        Person p = null;

        AsyncTask <bool> task = new AsyncTask <bool>(() =>
        {
            try
            {
                // update data in the cloud
                CloudUserManager groupMgr = CloudUserManager.Instance;

                if (groupMgr != null && persons != null)
                {
                    p = groupMgr.AddUserToGroup(name, string.Empty);
                    return(true);
                }

                return(false);
            }
            catch (Exception ex)
            {
                Debug.LogError("Failed to process task: " + ex.Message + "\n" + ex.StackTrace);
                return(false);
            }
        });

        task.Start();
        yield return(null);

        while (task.State == TaskState.Running)
        {
            yield return(null);
        }

        modalPanel.Hide();

        if (!task.Result)
        {
            modalPanel.ShowMessage("Error saving data!");
        }
        else
        {
            HidePersonDetails();

            if (p != null)
            {
                persons.Add(p);
                InstantiatePersonPanel(p);
            }
        }

        yield return(null);
    }
Beispiel #6
0
    private IEnumerator CheckGroupStatus()
    {
        AsyncTask <bool> task = new AsyncTask <bool>(() =>
        {
            CloudUserManager groupMgr = CloudUserManager.Instance;

            // wait for the group manager to start
            int waitPeriods = 10;
            while (groupMgr == null && waitPeriods > 0)
            {
                Thread.Sleep(500);
                waitPeriods--;

                groupMgr = CloudUserManager.Instance;
            }

            return(groupMgr ? groupMgr.IsGroupTrained() : false);
        });

        task.Start();
        yield return(null);

        while (task.State == TaskState.Running)
        {
            yield return(null);
        }

        if (!task.Result)
        {
            if (!string.IsNullOrEmpty(task.ErrorMessage))
            {
                Debug.LogError(task.ErrorMessage);
            }

            TrainGroupButton.SetActive(true);
        }

        CloudUserManager userManager = CloudUserManager.Instance;

        if (userManager && listHeaderText)
        {
            listHeaderText.text = "Group: " + userManager.userGroupId;
        }

        yield return(null);
    }
    private void OnSaveUserClick(Face f, InputField saveNameInput, InputField safeInfoInput)
    {
        // Create user info string
        Dictionary <string, string> dUserInfo = new Dictionary <string, string>();

        if (safeInfoInput.text != null && safeInfoInput.text.Trim() != string.Empty)
        {
            dUserInfo["UserInfo"] = safeInfoInput.text.Trim();
        }

        if (f != null && f.faceAttributes != null)
        {
            dUserInfo["Gender"] = f.faceAttributes.gender;
            dUserInfo["Age"]    = f.faceAttributes.age.ToString();
            //dUserInfo["Smile"] = string.Format("{0:F3}", f.faceAttributes.smile);
            dUserInfo["Created"] = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        }

        string sUserInfo = CloudUserManager.ConvertDictToInfo(dUserInfo);

        // Create the user
        StartCoroutine(AddUserToGroup(f, saveNameInput.text, sUserInfo));
    }
    // Creates new user and adds it to the user group
    private IEnumerator AddUserToGroup(Face face, string userName, string userInfo)
    {
        CloudUserManager userManager = CloudUserManager.Instance;

        if (texCamShot && userManager && face != null && userName != null && userName.Trim() != string.Empty)
        {
            SetHintText("Wait...");
            yield return(null);

            FaceRectangle faceRect   = face.faceRectangle;
            byte[]        imageBytes = texCamShot.EncodeToJPG();
            yield return(null);

            AsyncTask <Person> task = new AsyncTask <Person>(() => {
                return(userManager.AddUserToGroup(userName.Trim(), userInfo, imageBytes, faceRect));
            });

            task.Start();
            yield return(null);

            while (task.State == TaskState.Running)
            {
                yield return(null);
            }

            // Get the resulting person
            Person person = task.Result;

            if (!string.IsNullOrEmpty(task.ErrorMessage))
            {
                SetHintText(task.ErrorMessage);
                Debug.LogError(task.ErrorMessage);
            }
            else if (person != null && person.persistedFaceIds != null && person.persistedFaceIds.Length > 0)
            {
                string faceId     = face.faceId;
                bool   bFaceFound = false;

                for (int i = 0; i < faces.Length; i++)
                {
                    if (faces[i].faceId == faceId)
                    {
                        if (faces[i].candidate == null || faces[i].candidate.person == null)
                        {
                            faces[i].candidate = new Candidate();

                            faces[i].candidate.personId   = person.personId;
                            faces[i].candidate.confidence = 1f;
                            faces[i].candidate.person     = person;
                        }

                        bFaceFound = true;
                        break;
                    }
                }

                if (!bFaceFound)
                {
                    Debug.Log(string.Format("Face {0} not found.", faceId));
                }

                SetHintText(string.Format("'{0}' created successfully.", userName.Trim()));
                ShowIdentityResult();
            }
            else
            {
                SetHintText("User could not be created.");
            }
        }

        yield return(null);
    }
    private void InstantiateUserItem(int i, Face f, Person p)
    {
        if (!userItemPrefab)
        {
            return;
        }

        GameObject userItemInstance = Instantiate <GameObject>(userItemPrefab);

        GameObject userImageObj = userItemInstance.transform.Find("UserImagePanel").gameObject;

        userImageObj.GetComponentInChildren <RawImage>().texture = f.faceImage;

        string faceColorName = FaceDetectionUtils.FaceColorNames[i % FaceDetectionUtils.FaceColors.Length];
        string userName      = string.Format("<color={0}>{1}</color>", faceColorName, p != null ? p.name : faceColorName + " face");

        GameObject userNameObj = userItemInstance.transform.Find("UserName").gameObject;

        userNameObj.GetComponent <Text>().text = userName;

        if (p != null)
        {
            Dictionary <string, string> dUserData = CloudUserManager.ConvertInfoToDict(p.userData);
            string sUserInfo = dUserData.ContainsKey("UserInfo") ? dUserData["UserInfo"] : string.Empty;

            GameObject userInfoObj = userItemInstance.transform.Find("UserInfo").gameObject;
            userInfoObj.GetComponent <Text>().text = sUserInfo;
            userInfoObj.SetActive(true);

            GameObject loginBtnObj = userItemInstance.transform.Find("LoginButton").gameObject;
            loginBtnObj.SetActive(true);

            Button loginButton = loginBtnObj.GetComponent <Button>();
            loginButton.onClick.AddListener(() => OnUserLoginClick(f));

            // enable selectable panel
            userItemInstance.GetComponent <Selectable>().enabled = true;
            AddUserPanelClickListener(userItemInstance, f);
        }
        else
        {
            GameObject saveNameObj = userItemInstance.transform.Find("SaveName").gameObject;
            saveNameObj.SetActive(true);

            GameObject saveInfoObj = userItemInstance.transform.Find("SaveInfo").gameObject;
            saveInfoObj.SetActive(true);

            GameObject saveBtnObj = userItemInstance.transform.Find("SaveButton").gameObject;
            saveBtnObj.SetActive(true);

            Button     saveButton    = saveBtnObj.GetComponent <Button>();
            InputField saveNameInput = saveNameObj.GetComponent <InputField>();
            InputField saveInfoInput = saveInfoObj.GetComponent <InputField>();
            saveButton.onClick.AddListener(() => OnSaveUserClick(f, saveNameInput, saveInfoInput));

            // Disable selectable panel
            userItemInstance.GetComponent <Selectable>().enabled = false;
        }

        userItemInstance.transform.SetParent(userListContent, false);
        personsPanels.Add(f.faceId, userItemInstance);
    }
    // Performs user recognition
    private IEnumerator DoUserRecognition()
    {
        // Get the image to detect
        faces      = null;
        texCamShot = null;

        if (cameraShot)
        {
            texCamShot = (Texture2D)cameraShot.texture;
            SetHintText("Wait...");
        }

        // Get the user manager instance
        CloudUserManager userManager = CloudUserManager.Instance;

        if (!userManager)
        {
            if (hintText)
            {
                hintText.text = "Check if the CloudFaceManager and CloudUserManager components exist in the scene.";
            }
        }
        else if (texCamShot)
        {
            byte[] imageBytes = texCamShot.EncodeToJPG();
            yield return(null);

            AsyncTask <bool> taskIdentify = new AsyncTask <bool>(() => {
                bool bSuccess = userManager.IdentifyUsers(imageBytes, ref faces, ref results);
                return(bSuccess);
            });

            taskIdentify.Start();
            yield return(null);

            while (taskIdentify.State == TaskState.Running)
            {
                yield return(null);
            }

            if (string.IsNullOrEmpty(taskIdentify.ErrorMessage))
            {
                if (taskIdentify.Result)
                {
                    CloudFaceManager.DrawFaceRects(texCamShot, faces, FaceDetectionUtils.FaceColors);
                    yield return(null);

                    SetHintText("Select user to login:"******"No users detected.");
                }

                // show the identified users
                ShowIdentityResult();
            }
            else
            {
                SetHintText(taskIdentify.ErrorMessage);
            }
        }

        yield return(null);
    }
Beispiel #11
0
    private IEnumerator TrainGroup()
    {
        AsyncTask <bool> task = new AsyncTask <bool>(() =>
        {
            CloudUserManager groupMgr = CloudUserManager.Instance;
            return(groupMgr.StartGroupTraining());
        });

        bool abort = false;

        modalPanel.ShowProgress("Started group training. Please wait.", () => abort = true);

        task.Start();
        yield return(null);

        while (task.State == TaskState.Running)
        {
            yield return(null);
        }

        if (!task.Result)
        {
            if (!string.IsNullOrEmpty(task.ErrorMessage))
            {
                modalPanel.ShowMessage(task.ErrorMessage);
            }
            else
            {
                modalPanel.ShowMessage("Group training failed. Please, try again later.");
            }

            yield return(null);
        }
        else if (!abort)
        {
            task = new AsyncTask <bool>(() =>
            {
                CloudUserManager groupMgr = CloudUserManager.Instance;

                bool isTrained = false;
                int retries    = 0;
                while (!isTrained && retries++ < 3 && !abort)
                {
                    Thread.Sleep(5000);
                    isTrained = groupMgr.IsGroupTrained();
                }

                return(isTrained);
            });

            task.Start();
            yield return(null);

            while (task.State == TaskState.Running)
            {
                yield return(null);
            }

            if (!abort)
            {
                if (!task.Result)
                {
                    if (!string.IsNullOrEmpty(task.ErrorMessage))
                    {
                        modalPanel.ShowMessage(task.ErrorMessage);
                    }
                    else
                    {
                        modalPanel.ShowMessage("Group training failed. Please, try again later.");
                    }
                }
                else
                {
                    modalPanel.ShowMessage("Group training succeeded.");
                    TrainGroupButton.SetActive(false);
                }
            }
        }

        yield return(null);
    }
Beispiel #12
0
    private IEnumerator LoadPersons()
    {
        modalPanel.ShowProgress("Loading users. Please wait ...");

        // Clear persons from the list
        if (persons != null)
        {
            persons.Clear();
        }
        foreach (GameObject panel in personsPanels.Values)
        {
            DestroyPersonPanel(panel);
        }

        personsPanels.Clear();

        AsyncTask <List <Person> > task = new AsyncTask <List <Person> >(() =>
        {
            // load persons here
            CloudUserManager groupMgr = CloudUserManager.Instance;

            // wait for the group manager to start
            int waitPeriods = 10;
            while (groupMgr == null && waitPeriods > 0)
            {
                Thread.Sleep(500);
                waitPeriods--;

                groupMgr = CloudUserManager.Instance;
            }

            return(groupMgr ? groupMgr.GetUsersList() : null);
        });

        task.Start();
        yield return(null);

        while (task.State == TaskState.Running)
        {
            yield return(null);
        }

        modalPanel.Hide();
        persons = task.Result;

        if (persons != null)
        {
            // sort the person names alphabetically
            persons = persons.OrderBy(p => p.name).ToList();

            foreach (Person p in persons)
            {
                InstantiatePersonPanel(p);
            }
        }
        else
        {
            if (!string.IsNullOrEmpty(task.ErrorMessage))
            {
                Debug.LogError(task.ErrorMessage);
            }
            else
            {
                Debug.LogError("Error loading users' list. Check the FaceManager- and UserGroupManager-components.");
            }
        }

        yield return(null);
    }