Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compleated Test Task 1 #11

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 25 additions & 24 deletions UndoAssessment.sln
Original file line number Diff line number Diff line change
@@ -1,60 +1,61 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 25.0.1705.6
# Visual Studio Version 17
VisualStudioVersion = 17.4.33213.308
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UndoAssessment.Android", "UndoAssessment\UndoAssessment.Android\UndoAssessment.Android.csproj", "{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UndoAssessment.iOS", "UndoAssessment\UndoAssessment.iOS\UndoAssessment.iOS.csproj", "{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UndoAssessment", "UndoAssessment\UndoAssessment\UndoAssessment.csproj", "{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UndoAssessment", "UndoAssessment\UndoAssessment\UndoAssessment.csproj", "{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
Debug|iPhoneSimulator = Debug|iPhoneSimulator
Release|iPhoneSimulator = Release|iPhoneSimulator
Debug|iPhone = Debug|iPhone
Debug|iPhoneSimulator = Debug|iPhoneSimulator
Release|Any CPU = Release|Any CPU
Release|iPhone = Release|iPhone
Release|iPhoneSimulator = Release|iPhoneSimulator
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Release|Any CPU.Build.0 = Release|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Debug|iPhone.Build.0 = Debug|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Release|Any CPU.Build.0 = Release|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Release|iPhone.ActiveCfg = Release|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Release|iPhone.Build.0 = Release|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{B08F8340-7FAF-4AB2-A9DA-BA5B14FE5FDE}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Release|Any CPU.Build.0 = Release|iPhoneSimulator
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Debug|iPhone.ActiveCfg = Debug|iPhone
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Debug|iPhone.Build.0 = Debug|iPhone
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Release|Any CPU.Build.0 = Release|iPhoneSimulator
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Release|iPhone.ActiveCfg = Release|iPhone
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Release|iPhone.Build.0 = Release|iPhone
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator
{4F77CCCB-68DC-4CC7-A528-DB6FF48741D0}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Release|Any CPU.Build.0 = Release|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Debug|iPhone.Build.0 = Debug|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Release|Any CPU.Build.0 = Release|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Release|iPhone.ActiveCfg = Release|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Release|iPhone.Build.0 = Release|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{7ED4972A-D279-4E63-B4F5-3D15590D4AA1}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
Expand Down Expand Up @@ -92,5 +92,8 @@
<Name>UndoAssessment</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
</Project>
<ItemGroup>
<AndroidResource Include="Resources\drawable\user.png" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
</Project>
Binary file added UndoAssessment/UndoAssessment.iOS/Resources/user.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions UndoAssessment/UndoAssessment.iOS/UndoAssessment.iOS.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -142,4 +142,7 @@
<Name>UndoAssessment</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<BundleResource Include="Resources\user.png" />
</ItemGroup>
</Project>
14 changes: 13 additions & 1 deletion UndoAssessment/UndoAssessment/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,22 @@
using Xamarin.Forms.Xaml;
using UndoAssessment.Services;
using UndoAssessment.Views;
using System.Threading.Tasks;
using System.ComponentModel.Design;

namespace UndoAssessment
{
public partial class App : Application
public partial class App : Application, IDialogService
{

public App ()
{
InitializeComponent();

DependencyService.Register<MockDataStore>();
DependencyService.Register<DataRepository>();
DependencyService.Register<UserReopsitory>();
DependencyService.RegisterSingleton<IDialogService>(this);
MainPage = new AppShell();
}

Expand All @@ -28,6 +33,13 @@ protected override void OnSleep ()
protected override void OnResume ()
{
}


//Rather rough but valid MVVM approach to dialog service
public async Task ShowDialogAsync(string title, string message, string cancel)
{
await this.MainPage.DisplayAlert(title, message, cancel);
}
}
}

1 change: 1 addition & 0 deletions UndoAssessment/UndoAssessment/AppShell.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
</Shell.Resources>

<TabBar>
<ShellContent Title="Data" Icon="icon_about.png" Route="DataFetchPage" ContentTemplate="{DataTemplate local:DataFetchPage}" />
<ShellContent Title="About" Icon="icon_about.png" Route="AboutPage" ContentTemplate="{DataTemplate local:AboutPage}" />
<ShellContent Title="Browse" Icon="icon_feed.png" ContentTemplate="{DataTemplate local:ItemsPage}" />
</TabBar>
Expand Down
1 change: 1 addition & 0 deletions UndoAssessment/UndoAssessment/AppShell.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ public AppShell()
InitializeComponent();
Routing.RegisterRoute(nameof(ItemDetailPage), typeof(ItemDetailPage));
Routing.RegisterRoute(nameof(NewItemPage), typeof(NewItemPage));
Routing.RegisterRoute(nameof(UserDataPage), typeof(UserDataPage));
}

}
Expand Down
68 changes: 68 additions & 0 deletions UndoAssessment/UndoAssessment/Converters/InvertedBoolConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using Xamarin.Forms;

namespace UndoAssessment.Converters
{
internal class InvertedBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if(value is bool boolValue)
{
return !boolValue;
}

return value;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool boolValue)
{
return !boolValue;
}

return value;
}
}

internal class NullOrEmptyStringToBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string stringValue)
{
return !string.IsNullOrEmpty(stringValue);
}

return value;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}


internal class PositiveIntToBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is int intValue)
{
return intValue >= 0;
}

return value;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
19 changes: 19 additions & 0 deletions UndoAssessment/UndoAssessment/Models/FailedMessage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using Newtonsoft.Json;
using System;

namespace UndoAssessment.Models
{
public class FailedMessage
{
[JsonProperty("errorCode")]
public int ErrorCode { get; set; }

[JsonProperty("message")]
public string Message { get; set; }

[JsonProperty("date")]
public DateTime Date { get; set; }
}


}
5 changes: 2 additions & 3 deletions UndoAssessment/UndoAssessment/Models/Item.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
using System;

namespace UndoAssessment.Models
namespace UndoAssessment.Models
{
public class Item
{
public string Id { get; set; }
public string Text { get; set; }
public string Description { get; set; }
}

}
16 changes: 16 additions & 0 deletions UndoAssessment/UndoAssessment/Models/SuccessfulMessage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using Newtonsoft.Json;
using System;

namespace UndoAssessment.Models
{
public class SuccessfulMessage
{
[JsonProperty("message")]
public string Message { get; set; }

[JsonProperty("date")]
public DateTime Date { get; set; }
}


}
9 changes: 9 additions & 0 deletions UndoAssessment/UndoAssessment/Models/User.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace UndoAssessment.Models
{
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}

}
64 changes: 64 additions & 0 deletions UndoAssessment/UndoAssessment/Services/DataRepository.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
using Polly;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using UndoAssessment.Models;

namespace UndoAssessment.Services
{
public class DataRepository
{
private const string SuccessUrl = "https://malkarakundostagingpublicapi.azurewebsites.net/success";
private const string FailUrl = "https://malkarakundostagingpublicapi.azurewebsites.net/fail";

private HttpClient client;
private IAsyncPolicy<HttpResponseMessage> defaultPolicy;

public DataRepository()
{
client = new HttpClient();
defaultPolicy = GetRetryPolicy();
}

public async Task<SuccessfulMessage> GetSuccess(CancellationToken cancellationToken)
{
var result = await ExecuteCall(SuccessUrl, cancellationToken);

return await ReadData<SuccessfulMessage>(result);
}

public async Task<FailedMessage> GetFailed(CancellationToken cancellationToken)
{
var result = await ExecuteCall(FailUrl, cancellationToken);

return await ReadData<FailedMessage>(result);
}

private async Task<HttpResponseMessage> ExecuteCall(string url, CancellationToken cancellationToken)
{
return await defaultPolicy.ExecuteAsync(async () => await client.GetAsync(url, cancellationToken));
}

private async Task<T> ReadData<T>(HttpResponseMessage responseMessage)
{
var data = await responseMessage.Content.ReadAsStringAsync();

return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(data);
}

static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
//We can make stricter policies in future to prevent failed requests...
return Policy
.HandleResult<HttpResponseMessage>(message => !message.IsSuccessStatusCode)
.WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(2), (result, timeSpan, retryCount, context) =>
{
//Logging placeholder
System.Diagnostics.Debug.WriteLine($"Request failed with {result.Result.StatusCode}. Waiting {timeSpan} before next retry. Retry attempt {retryCount}");
});
}
}
}
Loading