private void RunLatestBuild()
        {
            ClearStates();
            var hasBuild = HasBuild();

            if (!hasBuild)
            {
                return;
            }
            runBuildRequest = CLI.RunBuild(TrailBuild.BuildLocationPath);
            runBuildRequest.AddCallback((success, request) =>
            {
                if (!success && !request.IsCanceled && !string.IsNullOrEmpty(request.ErrorMessage))
                {
                    SDK.Log(LogLevel.Error, "Trail CLI", request.ErrorMessage);
                }
            });
        }
        void DrawLatestBuild()
        {
            var hasBuild = HasBuild();

            GUILayout.BeginVertical(EditorStyles.helpBox);
            GUILayout.Space(4f);
            GUILayout.BeginHorizontal();
            GUILayout.Label("LATEST BUILD");
            GUILayout.FlexibleSpace();
            if (hasBuild)
            {
                var time = BuildTime();
                GUILayout.Label(string.Format("{0} {1}", time.ToShortDateString(), time.ToShortTimeString()), uploadBuildStyle); // Date
            }
            GUILayout.EndHorizontal();
            GUILayout.BeginHorizontal();

            var iconArea = GUILayoutUtility.GetRect(16, 14);

            iconArea.width -= 4;
            iconArea.x     += 4;
            iconArea.y     += 2;
            GUI.DrawTexture(iconArea, hasBuild ? buildIcon : buildNotFoundIcon);
            if (hasBuild)
            {
                GUILayout.Label(TrailBuild.BuildLocationRelativePath, buildPathStyle);
                var pathArea = GUILayoutUtility.GetLastRect();
                var ev       = Event.current;
                if (ev.type == EventType.MouseDown && ev.button == 0 && pathArea.Contains(ev.mousePosition) && TrailBuild.HasBuild() && System.IO.Directory.Exists(TrailBuild.BuildLocationPath))
                {
                    try
                    {
                        EditorApplication.delayCall += () => System.Diagnostics.Process.Start(TrailBuild.BuildLocationPath);
                    }
                    catch (System.Exception)
                    {
                    }
                }

                GUILayout.FlexibleSpace();

                if (runBuildRequest != null)
                {
                    if (GUILayout.Button("Stop Running"))
                    {
                        EditorApplication.delayCall += () =>
                        {
                            runBuildRequest.Cancel();
                            runBuildRequest = null;
                        };
                    }
                }
                else if (uploadBuildRequest == null || uploadBuildRequest.IsComplete)
                {
                    if (GUILayout.Button("Run"))
                    {
                        EditorApplication.delayCall += RunLatestBuild;
                    }
                    if (GUILayout.Button("Upload"))
                    {
                        EditorApplication.delayCall += () => { UploadLatestBuild(); Repaint(); };
                    }
                }
                else
                {
                    if (GUILayout.Button("Cancel"))
                    {
                        EditorApplication.delayCall += uploadBuildRequest.Cancel;
                    }
                }
            }
            else
            {
                GUILayout.Label("No Trail build found", EditorStyles.boldLabel);
                GUILayout.FlexibleSpace();
            }

            GUILayout.EndHorizontal();

            if (runBuildRequest != null)
            {
                GUILayout.Space(8f);
                GUILayout.BeginHorizontal();
                GUILayout.Space(4f);
                var icon = GUILayoutUtility.GetRect(14f, 14f);
                icon.y += 2f;
                // Draw Spinner

                DrawLoadingIcon(new Rect(icon.position, new Vector2(13, 13)), loadingIcon, 4, 4, 1f);

                // RUnning build
                GUILayout.Label("Running build...", uploadBuildStyle);
                GUILayout.FlexibleSpace();

                if (GUILayout.Button("Open in browser"))
                {
                    Application.OpenURL(string.Format(RUN_BUILD_URL, CLI.DevServerRoomId));
                }

                GUILayout.EndHorizontal();

                if (runBuildRequest.IsComplete || runBuildRequest.IsCanceled)
                {
                    runBuildRequest = null;
                }
                else
                {
                    Repaint();
                }
            }
            if (uploadBuildRequest != null)
            {
                //Uploading Requests
                GUILayout.Space(8f);
                GUILayout.BeginHorizontal();
                GUILayout.Space(4f);
                if (uploadBuildRequest.IsComplete)
                {
                    var icon = GUILayoutUtility.GetRect(14f, 14f, GUILayout.Width(14f));
                    icon.y += 2f;
                    if (!string.IsNullOrEmpty(uploadBuildRequest.ErrorMessage))
                    {
                        GUI.DrawTexture(icon, errorIcon);
                        GUILayout.Label("Failed to upload to Trail - " + uploadBuildRequest.ErrorMessage, uploadBuildStyle);
                    }
                    else
                    {
                        if (!TrailBuild.IsUploaded)
                        {
                            // To clear if new build has been done and upload request still exists.
                            EditorApplication.delayCall += () => uploadBuildRequest = null;
                        }
                        GUI.DrawTexture(icon, checkmarkIcon);
                        GUILayout.Label("Uploaded to Trail", uploadBuildStyle);
                        GUILayout.FlexibleSpace();
                        var time = TrailBuild.UploadTime;
                        GUILayout.Label(string.Format("{0} {1}", time.ToShortDateString(), time.ToShortTimeString()), uploadBuildStyle);
                    }
                }
                else
                {
                    // Currently uploading
                    var icon = GUILayoutUtility.GetRect(14f, 14f, GUILayout.Width(14f));
                    icon.y += 2f;
                    DrawLoadingIcon(icon, this.loadingIcon, 4, 4, 1f);
                    GUILayout.Label(uploadBuildRequest.Progress >= 1f ? "Processing..." : "Uploading build...", uploadBuildStyle, GUILayout.Width(100f));
                    // TODO: Implement upload speed.
                    //  GUILayout.Label(string.Format("{0:0.0} Mb/s", uploadBuildRequest.MbPerSecond), uploadBuildStyle, GUILayout.Width(50f));
                    GUILayout.FlexibleSpace();

                    var loadingBarArea = GUILayoutUtility.GetRect(40f, 200f, 4f, 12f);
                    loadingBarArea.height = 4f;
                    loadingBarArea.y     += 8f;
                    loadingBarArea.x     += 20f;
                    loadingBarArea.width -= 24f;

                    GUI.DrawTexture(loadingBarArea, uploadBuildBackgroundTexture);
                    loadingBarArea.width *= Mathf.Abs(uploadBuildRequest.Progress);
                    GUI.DrawTexture(loadingBarArea, trailPurpleTexture);

                    Repaint();
                }
                GUILayout.EndHorizontal();
            }
            else if (hasBuild && TrailBuild.IsUploaded)
            {
                GUILayout.Space(8f);
                GUILayout.BeginHorizontal();
                GUILayout.Space(4f);
                var icon = GUILayoutUtility.GetRect(14f, 14f);
                icon.y += 2f;
                GUI.DrawTexture(icon, checkmarkIcon);
                GUILayout.Label("Uploaded to Trail", uploadBuildStyle);
                GUILayout.FlexibleSpace();
                var time = TrailBuild.UploadTime;
                GUILayout.Label(string.Format("{0} {1}", time.ToShortDateString(), time.ToShortTimeString()), uploadBuildStyle);
                GUILayout.EndHorizontal();
            }

            GUILayout.Space(8);
            GUILayout.EndVertical();
        }