Task CreateUpdateTask()
        {
            try
            {
                return(TaskUtils.RunForever(c =>
                {
                    Api
                    .Call <Api.Responses.Processes>(new Api.Requests.Processes(), Canceller.Token)
                    .ContinueWith(t =>
                    {
                        if (t.IsCanceled)
                        {
                            return new TwoLineListItem[0];
                        }

                        if (t.IsFaulted)
                        {
                            throw t.Exception;
                        }

                        return t.Result.processes
                        .Select(p => new TwoLineListItem
                        {
                            Line1 = $"{p.imageName} ({p.pid})",
                            Line2 = $"Memory: {UIConversion.FromBytes(p.memUsage)}, CPU: {TimeSpan.FromMilliseconds(p.cpuTime)}",
                            Tag = p
                        })
                        .OrderBy(i => i.Line1)
                        .ToArray();
                    })
                    .ContinueWith(t =>
                    {
                        RunOnUiThread(() =>
                        {
                            if (t.IsFaulted)
                            {
                                Log.Error(TAG, $"Failed to fetch processes with error {t.Exception.Flatten().InnerException}.");
                                Toast.MakeText(this, $"Failed to fetch processes.", ToastLength.Short).Show();
                                return;
                            }

                            Populate(t.Result);
                        });
                    });
                },
                                            Canceller.Token,
                                            REFRESH_PERIOD));
            }
            catch (Exception e)
            {
                Toast.MakeText(this, $"Failed to connect to {Title}", ToastLength.Short).Show();
                Log.Error(TAG, $"Failed to start activity with error {e}.");
                Finish();
                return(null);
            }
        }
 protected override TwoLineListItem[] Transform(Api.Responses.Service model)
 {
     return(new TwoLineListItem[]
     {
         new TwoLineListItem {
             Line1 = "Version", Line2 = model.version
         },
         new TwoLineListItem {
             Line1 = "Runtime", Line2 = string.Join(System.Environment.NewLine, model.versions.Select(m => $"{m.Name}@{m.Version}"))
         },
         new TwoLineListItem {
             Line1 = "Resident Set Size", Line2 = UIConversion.FromBytes(model.memory.residentSetSize)
         },
         new TwoLineListItem {
             Line1 = "Heap Used", Line2 = UIConversion.FromBytes(model.memory.heapUsed)
         },
         new TwoLineListItem {
             Line1 = "Heap Total", Line2 = UIConversion.FromBytes(model.memory.heapTotal)
         },
     });
 }
 protected override TwoLineListItem[] Transform(Api.Responses.Os model)
 {
     return(new TwoLineListItem[]
     {
         new TwoLineListItem {
             Line1 = "Uptime", Line2 = model.uptime
         },
         new TwoLineListItem {
             Line1 = "Architecture", Line2 = model.arch
         },
         new TwoLineListItem {
             Line1 = "Cpu(s)", Line2 = string.Join(System.Environment.NewLine, model.cpus.Select(cpu => cpu.model).GroupBy(s => s).Select(g => $"{g.Count()} x {g.First()}"))
         },
         new TwoLineListItem {
             Line1 = "Free Memory", Line2 = UIConversion.FromBytes(model.freemem)
         },
         new TwoLineListItem {
             Line1 = "Used Memory", Line2 = UIConversion.FromBytes(model.usedmem)
         },
         new TwoLineListItem {
             Line1 = "Total Memory", Line2 = UIConversion.FromBytes(model.totalmem)
         },
     });
 }