bool CheckXiaomiPackageVersions()
        {
            if (isVersionInitialized)
            {
                return(true);
            }

            NativeStatusCode getCurrentVersionOperationStatus;

            if (getCurrentVersionOperationId < 0)
            {
                getCurrentVersionOperationStatus = NativeClient.List(out getCurrentVersionOperationId);
            }
            else
            {
                getCurrentVersionOperationStatus = NativeClient.GetOperationStatus(getCurrentVersionOperationId);
            }

            // Reset and return false if it fails with StatusCode.Error or Status.NotFound.
            if (getCurrentVersionOperationStatus > NativeStatusCode.Done)
            {
                getCurrentVersionOperationId = -1;
                return(false);
            }

            NativeStatusCode getLatestVersionOperationStatus;

            if (getLatestVersionOperationId < 0)
            {
                getLatestVersionOperationStatus = NativeClient.Search(out getLatestVersionOperationId, xiaomiPackageName);
            }
            else
            {
                getLatestVersionOperationStatus = NativeClient.GetOperationStatus(getLatestVersionOperationId);
            }

            // Reset and return false if it fails with StatusCode.Error or Status.NotFound.
            if (getLatestVersionOperationStatus > NativeStatusCode.Done)
            {
                getLatestVersionOperationId = -1;
                return(false);
            }

            // Get version info if both operations are done.
            if (getCurrentVersionOperationStatus == NativeStatusCode.Done && getLatestVersionOperationStatus == NativeStatusCode.Done)
            {
                CheckPackmanOperation(getCurrentVersionOperationId, PackmanOperationType.List);
                CheckPackmanOperation(getLatestVersionOperationId, PackmanOperationType.Search);

                System.Console.WriteLine("Current xiaomi package version is " + (string.IsNullOrEmpty(currentXiaomiPackageVersion) ? "empty" : currentXiaomiPackageVersion));
                System.Console.WriteLine("Latest xiaomi package version is " + (string.IsNullOrEmpty(latestXiaomiPackageVersion) ? "empty" : latestXiaomiPackageVersion));

                isVersionInitialized = true;
                return(true);
            }

            return(false);
        }
        bool CheckPackmanOperation(long operationId, PackmanOperationType operationType)
        {
            NativeStatusCode statusCode = NativeClient.GetOperationStatus(operationId);

            if (statusCode == NativeStatusCode.NotFound)
            {
                Debug.LogError("OperationID " + operationId + " Not Found");
                return(true);
            }
            else if (statusCode == NativeStatusCode.Error)
            {
                Error error = NativeClient.GetOperationError(operationId);
                Debug.LogError("OperationID " + operationId + " failed with Error: " + error);
                return(true);
            }
            else if (statusCode == NativeStatusCode.InProgress || statusCode == NativeStatusCode.InQueue)
            {
                return(false);
            }
            else if (statusCode == NativeStatusCode.Done)
            {
                System.Console.WriteLine("OperationID " + operationId + " Done");
                switch (operationType)
                {
                case PackmanOperationType.List:
                    ExtractCurrentXiaomiPackageInfo(operationId);
                    break;

                case PackmanOperationType.Add:
                    currentXiaomiPackageVersion = latestXiaomiPackageVersion;
                    xiaomiPackageInstalled      = true;
                    break;

                case PackmanOperationType.Remove:
                    currentXiaomiPackageVersion = "";
                    xiaomiPackageInstalled      = false;
                    break;

                case PackmanOperationType.Search:
                    ExtractLatestXiaomiPackageInfo(operationId);
                    break;

                default:
                    System.Console.WriteLine("Type " + operationType + " Not Supported");
                    break;
                }
                return(true);
            }

            return(true);
        }