Added WeatherApp Sample

This commit is contained in:
Javier Suárez Ruiz 2017-12-12 21:43:38 +01:00
parent 4248652123
commit de10d8a179
8 changed files with 241 additions and 0 deletions

View File

@ -33,6 +33,7 @@ namespace Samples
new DotMatrixClockSample().Publish(); new DotMatrixClockSample().Publish();
new EditorSample().Publish(); new EditorSample().Publish();
new TipCalcSample().Publish(); new TipCalcSample().Publish();
new WeatherAppSample().Publish();
new XuzzleSample().Publish(); new XuzzleSample().Publish();
UI.Present ("/display-alert"); UI.Present ("/display-alert");

View File

@ -44,6 +44,9 @@
<EmbeddedResource Update="TipCalc\TipCalcPage.xaml"> <EmbeddedResource Update="TipCalc\TipCalcPage.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Update="WeatherApp\WeatherPage.xaml">
<Generator>MSBuild:Compile</Generator>
</EmbeddedResource>
<EmbeddedResource Update="XamlPreviewPage.xaml"> <EmbeddedResource Update="XamlPreviewPage.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator> <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
</EmbeddedResource> </EmbeddedResource>
@ -54,6 +57,7 @@
<None Remove="BugSweeper\Images\Xamarin120.png" /> <None Remove="BugSweeper\Images\Xamarin120.png" />
<None Remove="DotMatrixClock\DotMatrixClockPage.xaml" /> <None Remove="DotMatrixClock\DotMatrixClockPage.xaml" />
<None Remove="TipCalc\TipCalcPage.xaml" /> <None Remove="TipCalc\TipCalcPage.xaml" />
<None Remove="WeatherApp\WeatherPage.xaml" />
</ItemGroup> </ItemGroup>
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>

View File

@ -0,0 +1,41 @@
using System;
using System.Threading.Tasks;
namespace WeatherApp
{
public class Core
{
public static async Task<Weather> GetWeather(string zipCode)
{
//Sign up for a free API key at http://openweathermap.org/appid
string key = "fc9f6c524fc093759cd28d41fda89a1b";
string queryString = "http://api.openweathermap.org/data/2.5/weather?zip="
+ zipCode + "&appid=" + key;
var results = await DataService.getDataFromService(queryString).ConfigureAwait(false);
if (results["weather"] != null)
{
Weather weather = new Weather
{
Title = (string)results["name"],
Temperature = (string)results["main"]["temp"] + " F",
Wind = (string)results["wind"]["speed"] + " mph",
Humidity = (string)results["main"]["humidity"] + " %",
Visibility = (string)results["weather"][0]["main"]
};
DateTime time = new DateTime(1970, 1, 1, 0, 0, 0, 0);
DateTime sunrise = time.AddSeconds((double)results["sys"]["sunrise"]);
DateTime sunset = time.AddSeconds((double)results["sys"]["sunset"]);
weather.Sunrise = sunrise.ToString() + " UTC";
weather.Sunset = sunset.ToString() + " UTC";
return weather;
}
else
{
return null;
}
}
}
}

View File

@ -0,0 +1,25 @@
using System.Threading.Tasks;
using Newtonsoft.Json;
using System.Net.Http;
using Newtonsoft.Json.Linq;
namespace WeatherApp
{
public class DataService
{
public static async Task<JContainer> getDataFromService(string queryString)
{
HttpClient client = new HttpClient();
var response = await client.GetAsync(queryString);
JContainer data = null;
if (response != null)
{
string json = response.Content.ReadAsStringAsync().Result;
data = (JContainer)JsonConvert.DeserializeObject(json);
}
return data;
}
}
}

View File

@ -0,0 +1,26 @@
namespace WeatherApp
{
public class Weather
{
public string Title { get; set; }
public string Temperature { get; set; }
public string Wind { get; set; }
public string Humidity { get; set; }
public string Visibility { get; set; }
public string Sunrise { get; set; }
public string Sunset { get; set; }
public Weather()
{
//Because labels bind to these values, set them to an empty string to
//ensure that the label appears on all platforms by default.
this.Title = " ";
this.Temperature = " ";
this.Wind = " ";
this.Humidity = " ";
this.Visibility = " ";
this.Sunrise = " ";
this.Sunset = " ";
}
}
}

View File

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="WeatherApp.WeatherPage">
<ContentPage.Resources>
<ResourceDictionary>
<Style x:Key="labelStyle" TargetType="Label">
<Setter Property="TextColor" Value="#a8a8a8" />
<Setter Property="FontSize" Value="Small" />
</Style>
<Style x:Key="fieldStyle" TargetType="Label">
<Setter Property="TextColor">
<OnPlatform x:TypeArguments="Color">
<On Platform="iOS" Value="Black" />
<On Platform="Android, UWP, WinRT, WinPhone" Value="White" />
</OnPlatform>
</Setter>
<Setter Property="FontSize" Value="Medium" />
</Style>
<Style x:Key="fieldView" TargetType="ContentView">
<Setter Property="Padding" Value="10,0,0,0" />
</Style>
</ResourceDictionary>
</ContentPage.Resources>
<ContentPage.Content>
<ScrollView>
<StackLayout>
<StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand"
BackgroundColor="#545454">
<StackLayout Padding="10,10,10,10" HorizontalOptions="Start">
<Label Text="Search by Zip Code" TextColor="White" FontAttributes="Bold"
FontSize="Medium" />
<Label x:Name="zipCodeLabel" Text="Zip Code" Style="{StaticResource labelStyle}" />
<Entry x:Name="zipCodeEntry" />
</StackLayout>
<StackLayout Padding="0,0,0,10" VerticalOptions="End">
<Button x:Name="getWeatherBtn" Text="Get Weather" WidthRequest="185" BorderWidth="1" >
<!-- Set iOS colors; use defaults on other platforms -->
<Button.TextColor>
<OnPlatform x:TypeArguments="Color">
<On Platform="iOS" Value="White" />
</OnPlatform>
</Button.TextColor>
<Button.BorderColor>
<OnPlatform x:TypeArguments="Color">
<On Platform="iOS" Value="White" />
</OnPlatform>
</Button.BorderColor>
</Button>
</StackLayout>
</StackLayout>
<StackLayout Padding="10,10,10,10" HorizontalOptions="Start">
<Label Text="Location" Style="{StaticResource labelStyle}" />
<ContentView Style="{StaticResource fieldView}">
<Label Text="{Binding Title}" Style="{StaticResource fieldStyle}" />
</ContentView>
<Label Text="Temperature" Style="{StaticResource labelStyle}" />
<ContentView Style="{StaticResource fieldView}">
<Label x:Name="tempLabel" Text="{Binding Temperature}"
Style="{StaticResource fieldStyle}" />
</ContentView>
<Label Text="Wind Speed" Style="{StaticResource labelStyle}" />
<ContentView Style="{StaticResource fieldView}">
<Label x:Name="windLabel" Text="{Binding Wind}" Style="{StaticResource fieldStyle}" />
</ContentView>
<Label Text="Humidity" Style="{StaticResource labelStyle}" />
<ContentView Style="{StaticResource fieldView}">
<Label x:Name="humidityLabel" Text="{Binding Humidity}"
Style="{StaticResource fieldStyle}" />
</ContentView>
<Label Text="Visibility" Style="{StaticResource labelStyle}" />
<ContentView Style="{StaticResource fieldView}">
<Label x:Name="visibilitylabel" Text="{Binding Visibility}"
Style="{StaticResource fieldStyle}" />
</ContentView>
<Label Text="Time of Sunrise" Style="{StaticResource labelStyle}" />
<ContentView Style="{StaticResource fieldView}">
<Label x:Name="sunriseLabel" Text="{Binding Sunrise}"
Style="{StaticResource fieldStyle}" />
</ContentView>
<Label Text="Time of Sunset" Style="{StaticResource labelStyle}" />
<ContentView Style="{StaticResource fieldView}">
<Label x:Name="sunsetLabel" Text="{Binding Sunset}"
Style="{StaticResource fieldStyle}" />
</ContentView>
</StackLayout>
</StackLayout>
</ScrollView>
</ContentPage.Content>
</ContentPage>

View File

@ -0,0 +1,31 @@
using System;
using Xamarin.Forms;
namespace WeatherApp
{
public partial class WeatherPage : ContentPage
{
public WeatherPage()
{
InitializeComponent();
this.Title = "Sample Weather App";
getWeatherBtn.Clicked += GetWeatherBtn_Clicked;
//Set the default binding to a default object for now
this.BindingContext = new Weather();
}
private async void GetWeatherBtn_Clicked(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(zipCodeEntry.Text))
{
Weather weather = await Core.GetWeather(zipCodeEntry.Text);
if (weather != null)
{
this.BindingContext = weather;
getWeatherBtn.Text = "Search Again";
}
}
}
}
}

View File

@ -0,0 +1,21 @@
using Ooui;
using Xamarin.Forms;
namespace Samples
{
public class WeatherAppSample : ISample
{
public string Title => "Xamarin.Forms WeatherApp";
public Ooui.Element CreateElement()
{
var page = new WeatherApp.WeatherPage();
return page.GetOouiElement();
}
public void Publish()
{
UI.Publish("/weatherapp", CreateElement);
}
}
}