示例#1
0
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            Name            = Intent.Extras.GetString("name");
            Address         = Intent.Extras.GetString("address");
            DatasetName     = Intent.Extras.GetString("datasetName");
            DatasetAlias    = Intent.Extras.GetString("datasetAlias");
            TimestampOffset = Intent.Extras.GetLong("timestampOffset");
            var sourceUnit = Intent.Extras.GetString("datasetSourceUnit");
            var targetUnit = Intent.Extras.GetString("datasetTargetUnit");

            Title = $"{Name} ({Address})";

            try
            {
                Converter = UnitConverter.Create(sourceUnit, targetUnit);

                Api = new ApiClient(Address);

                Api.Call <Api.Responses.Dataset>(new Api.Requests.Dataset(DatasetName, null, null), Canceller.Token)
                .ContinueWith(t =>
                {
                    if (t.IsCanceled)
                    {
                        return;
                    }

                    if (t.IsFaulted)
                    {
                        Log.Error(TAG, $"Failed to fetch dataset {DatasetName} with error {t.Exception.Flatten().InnerException}.");
                        Toast.MakeText(this, "Failed to get performance information.", ToastLength.Short).Show();
                        return;
                    }

                    RunOnUiThread(() =>
                    {
                        // Change units.
                        var dataset = t
                                      .Result
                                      .dataset
                                      .Select(d => new DataPoint
                        {
                            Timestamp = d.Timestamp - TimestampOffset,
                            Value     = Converter.ChangeUnits(d.Value),
                        })
                                      .ToArray();

                        var minValue = dataset.Min(d => d.Value);
                        var min      = dataset.First(d => d.Value == minValue);
                        var maxValue = dataset.Max(d => d.Value);
                        var max      = dataset.First(d => d.Value == maxValue);
                        var width    = maxValue - minValue;

                        var datasetMap = dataset.ToDictionary(d => new BarModel
                        {
                            Value = d.Value,
                            ValueCaptionHidden = true,
                        });

                        var chart = new BarChartView(this)
                        {
                            ItemsSource  = datasetMap.Keys,
                            BarWidth     = 3,
                            BarOffset    = 1,
                            MinimumValue = min.Value - width / 2,
                            MaximumValue = max.Value + width / 2,
                        };

                        chart.AutoLevelsEnabled = false;
                        chart.AddLevelIndicator(min.Value, StringizeValue(min.Value));
                        chart.AddLevelIndicator(max.Value, StringizeValue(max.Value));

                        chart.BarClick += (sender, args) => {
                            DataPoint data = null;
                            if (!datasetMap.TryGetValue(args.Bar, out data))
                            {
                                return;
                            }

                            new AlertDialog.Builder(this)
                            .SetCancelable(false)
                            .SetTitle(UIConversion.FromMilliseconds(data.Timestamp).ToString())
                            .SetMessage(StringizeValue(data.Value))
                            .SetPositiveButton("OK", (s, e) => { })
                            .Create()
                            .Show();
                        };

                        SetContentView(chart, new ViewGroup.LayoutParams(
                                           ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent)
                                       );
                    });
                });
            }
            catch (Exception e)
            {
                Toast.MakeText(this, $"Failed to get performance information for {DatasetName} for {Title}", ToastLength.Short).Show();
                Log.Error(TAG, $"Failed to start activity for dataset {DatasetName} with error {e}.");
                Finish();
            }
        }