Compare commits
71 Commits
POS_Sprint
...
master
Author | SHA1 | Date | |
---|---|---|---|
5b1657e4f6 | |||
74df2904b2 | |||
4b41abf79d | |||
4ccce95280 | |||
d103e4146d | |||
|
1941a77a91 | ||
|
41c703bb6d | ||
8b51fa1310 | |||
327262473d | |||
8ce472a931 | |||
|
f2f98bb92d | ||
|
e815313439 | ||
|
dd6a16df54 | ||
966edab483 | |||
925b79e1ca | |||
f0e62f261e | |||
15e4ebbaa0 | |||
8c97d210bc | |||
46b97ec42f | |||
42be667958 | |||
2d5e43a42b | |||
fc00e94f6a | |||
b3732fc11d | |||
ded54aeabd | |||
f44eef3079 | |||
d8ca055c90 | |||
d16fb48c15 | |||
8581e26ac5 | |||
37339bbb6a | |||
d2fe3e384c | |||
2e5b7422cf | |||
364da365e7 | |||
353c7283cf | |||
a6679995b6 | |||
08c27b3c3a | |||
6126c2d929 | |||
5b909f6d1a | |||
|
a41b7d3829 | ||
|
c9de5656c3 | ||
6586dc6170 | |||
|
da4287973e | ||
|
d9b9b19e7d | ||
c322233ae8 | |||
70afc48290 | |||
3128f9ef5d | |||
dbc629f942 | |||
10cf3ca9c0 | |||
2ea2a4293f | |||
a83d141ac2 | |||
48a742651a | |||
50e664ae5a | |||
|
362cfdcee0 | ||
|
cfb0800065 | ||
|
04ad1f02f4 | ||
|
11f96f9d06 | ||
3e8eed3e25 | |||
|
c2c1cfe943 | ||
7687c54609 | |||
|
b9f6739a55 | ||
|
e4114ae7e6 | ||
827b522c65 | |||
b1b934ca9b | |||
|
83665f0919 | ||
|
dd74f059da | ||
|
4447d72032 | ||
8e3c9635c3 | |||
44b7f9e1a7 | |||
a6d1d028f3 | |||
1dda5c1770 | |||
69dc67eb28 | |||
b7a4361a00 |
@ -13,57 +13,103 @@ using System.Security;
|
||||
using System.Net;
|
||||
using System.Linq;
|
||||
|
||||
using Newtonsoft.Json;
|
||||
using Klient.Droid.Modules;
|
||||
using Android.Provider;
|
||||
using Android.Content;
|
||||
using Android.Graphics;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
using Com.Xamarin.Formsviewgroup;
|
||||
using Android.Icu.Text;
|
||||
using System.IO;
|
||||
using Android.Media;
|
||||
using System.Threading.Tasks;
|
||||
using Java.IO;
|
||||
using System.Net.Http.Headers;
|
||||
|
||||
namespace Klient.Droid
|
||||
{
|
||||
[Activity(Label = "Klient", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
|
||||
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
|
||||
{
|
||||
Bitmap bitmap;
|
||||
ByteArrayContent fileContent;
|
||||
public static int PickImageId = 1000;
|
||||
private static readonly HttpClient client = new HttpClient();
|
||||
public static Android.Content.Intent photo;
|
||||
public string savedLogin = "";
|
||||
public string savedName = "";
|
||||
public string savedSurname = "";
|
||||
public string savedEmail = "";
|
||||
private string userId = "";
|
||||
private string userToken = "";
|
||||
|
||||
protected override void OnCreate(Bundle savedInstanceState)
|
||||
{
|
||||
|
||||
base.OnCreate(savedInstanceState);
|
||||
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
|
||||
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
|
||||
StrictMode.SetVmPolicy(builder.Build());
|
||||
LoadApplication(new App());
|
||||
SetContentView(Resource.Layout.ekranLogowania);
|
||||
SetContentView(Resource.Layout.ekranStartowy);
|
||||
}
|
||||
|
||||
[Java.Interop.Export("SignIn")]
|
||||
async public void SignIn(View v)
|
||||
async public void SignIn(Android.Views.View v)
|
||||
{
|
||||
var Login = FindViewById<EditText>(Resource.Id.Login).Text;
|
||||
SecureString Password = new NetworkCredential("", FindViewById<EditText>(Resource.Id.Password).Text).SecurePassword;
|
||||
|
||||
if(Login.Length < 3 || Login.Length > 12)
|
||||
|
||||
if (string.IsNullOrWhiteSpace(new NetworkCredential("", Password).Password))
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranLogowania);
|
||||
FindViewById<TextView>(Resource.Id.ErrorLogIn).Text = "Hasło nie może być puste ani zawierać spacji!";
|
||||
FindViewById<EditText>(Resource.Id.Password).Text = "";
|
||||
}
|
||||
if(string.IsNullOrWhiteSpace(new NetworkCredential("", Password).Password))
|
||||
else
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranLogowania);
|
||||
var values = new Dictionary<string, string>
|
||||
{
|
||||
{ "login", Login },
|
||||
{ "password", new NetworkCredential("", Password).Password }
|
||||
};
|
||||
|
||||
var content = new FormUrlEncodedContent(values);
|
||||
var response = await client.PostAsync("https://pixblocksaddition.azurewebsites.net/api/User/SignIn", content);
|
||||
|
||||
if (response.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
var jsonString = await response.Content.ReadAsStringAsync();
|
||||
dynamic jsonObject = JsonConvert.DeserializeObject(jsonString);
|
||||
SetContentView(Resource.Layout.ekranPoLogowaniu);
|
||||
savedLogin = jsonObject.user.login;
|
||||
savedName = jsonObject.user.name;
|
||||
savedEmail = jsonObject.user.email;
|
||||
savedSurname = jsonObject.user.surname;
|
||||
userId = jsonObject.user.id;
|
||||
userToken = jsonObject.jwt.token;
|
||||
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", userToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
string msg = await response.Content.ReadAsStringAsync();
|
||||
FindViewById<TextView>(Resource.Id.ErrorLogIn).Text = msg;
|
||||
FindViewById<EditText>(Resource.Id.Password).Text = "";
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
var values = new Dictionary<string, string>
|
||||
{
|
||||
{ "login", Login },
|
||||
{ "password", new NetworkCredential("", Password).Password }
|
||||
};
|
||||
|
||||
var content = new FormUrlEncodedContent(values);
|
||||
|
||||
var response = await client.PostAsync("https://localhost:44371/api/User/SignIn", content);
|
||||
|
||||
var responseString = await response.Content.ReadAsStringAsync();
|
||||
}
|
||||
|
||||
[Java.Interop.Export("ResetPassword")]
|
||||
async public void ResetPassword()
|
||||
[Java.Interop.Export("HelpLoginScreen")]
|
||||
public void GoToAboutScreen(View v)
|
||||
{
|
||||
|
||||
SetContentView(Resource.Layout.ekranInformacji);
|
||||
}
|
||||
|
||||
[Java.Interop.Export("SignUp")]
|
||||
async public void SignUp()
|
||||
async public void SignUp(View v)
|
||||
{
|
||||
var Name = FindViewById<EditText>(Resource.Id.Name).Text;
|
||||
var Surname = FindViewById<EditText>(Resource.Id.Surname).Text;
|
||||
@ -72,31 +118,360 @@ namespace Klient.Droid
|
||||
SecureString Password = new NetworkCredential("", FindViewById<EditText>(Resource.Id.NewPassword).Text).SecurePassword;
|
||||
SecureString Password2 = new NetworkCredential("", FindViewById<EditText>(Resource.Id.RepeatPassword).Text).SecurePassword;
|
||||
|
||||
if(new NetworkCredential("", Password).Password != new NetworkCredential("", Password2).Password)
|
||||
if (Login.Length < 3 || Login.Length > 12)
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranRejestracji);
|
||||
FindViewById<TextView>(Resource.Id.ErrorRegister).Text = "Login musi mieć od 3 do 12 znaków!";
|
||||
FindViewById<EditText>(Resource.Id.NewPassword).Text = "";
|
||||
FindViewById<EditText>(Resource.Id.RepeatPassword).Text = "";
|
||||
|
||||
}
|
||||
else if (new NetworkCredential("", Password).Password.Length < 8 || new NetworkCredential("", Password).Password.Length > 20 || string.IsNullOrWhiteSpace(new NetworkCredential("", Password).Password))
|
||||
{
|
||||
FindViewById<TextView>(Resource.Id.ErrorRegister).Text = "Hasło musi mieć od 8 do 20 znaków!";
|
||||
FindViewById<EditText>(Resource.Id.NewPassword).Text = "";
|
||||
FindViewById<EditText>(Resource.Id.RepeatPassword).Text = "";
|
||||
|
||||
}
|
||||
|
||||
var values = new Dictionary<string, string>
|
||||
else if (new NetworkCredential("", Password).Password != new NetworkCredential("", Password2).Password)
|
||||
{
|
||||
{ "email", Email },
|
||||
{ "name", Name },
|
||||
{ "surname", Surname },
|
||||
{ "login", Login },
|
||||
{ "password", new NetworkCredential("", Password).Password }
|
||||
};
|
||||
FindViewById<TextView>(Resource.Id.ErrorRegister).Text = "Hasła muszą być identyczne!";
|
||||
FindViewById<EditText>(Resource.Id.NewPassword).Text = "";
|
||||
FindViewById<EditText>(Resource.Id.RepeatPassword).Text = "";
|
||||
}
|
||||
else if(string.IsNullOrEmpty(FindViewById<EditText>(Resource.Id.NewLogin).Text) || string.IsNullOrEmpty(FindViewById<EditText>(Resource.Id.Email).Text) || string.IsNullOrEmpty(FindViewById<EditText>(Resource.Id.NewPassword).Text) || string.IsNullOrEmpty(FindViewById<EditText>(Resource.Id.RepeatPassword).Text) || string.IsNullOrEmpty(FindViewById<EditText>(Resource.Id.Name).Text) || string.IsNullOrEmpty(FindViewById<EditText>(Resource.Id.Surname).Text))
|
||||
{
|
||||
FindViewById<TextView>(Resource.Id.ErrorRegister).Text = "Wartości nie mogą być puste!";
|
||||
FindViewById<EditText>(Resource.Id.NewPassword).Text = "";
|
||||
FindViewById<EditText>(Resource.Id.RepeatPassword).Text = "";
|
||||
}
|
||||
|
||||
var content = new FormUrlEncodedContent(values);
|
||||
else
|
||||
{
|
||||
var values = new Dictionary<string, string>
|
||||
{
|
||||
{ "email", Email },
|
||||
{ "name", Name },
|
||||
{ "surname", Surname },
|
||||
{ "login", Login },
|
||||
{ "password", new NetworkCredential("", Password).Password }
|
||||
};
|
||||
|
||||
var response = await client.PostAsync("https://localhost:44371/api/User/Register", content);
|
||||
var content = new FormUrlEncodedContent(values);
|
||||
|
||||
var responseString = await response.Content.ReadAsStringAsync();
|
||||
var response = await client.PostAsync("https://pixblocksaddition.azurewebsites.net/api/User/Register", content);
|
||||
|
||||
var responseString = await response.Content.ReadAsStringAsync();
|
||||
|
||||
if (response.StatusCode == HttpStatusCode.OK) SetContentView(Resource.Layout.ekranLogowania);
|
||||
else
|
||||
{
|
||||
string msg = await response.Content.ReadAsStringAsync();
|
||||
FindViewById<TextView>(Resource.Id.ErrorRegister).Text = msg;
|
||||
FindViewById<EditText>(Resource.Id.Password).Text = "";
|
||||
FindViewById<EditText>(Resource.Id.RepeatPassword).Text = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Java.Interop.Export("HelpLoginScreen")]
|
||||
[Java.Interop.Export("HelpRegisterScreen")]
|
||||
public void GoToRegisterHelp(View v)
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranPomocRejestracja);
|
||||
}
|
||||
|
||||
|
||||
[Java.Interop.Export("GoToProfile")]
|
||||
public void GoBackToProfile(View v)
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranProfil);
|
||||
}
|
||||
|
||||
[Java.Interop.Export("GoToRegister")]
|
||||
public void HelpLoginScreen(View v)
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranRejestracji);
|
||||
}
|
||||
[Java.Interop.Export("SignInMainScreen")]
|
||||
public void MainScreenSignIn(View v)
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranLogowania);
|
||||
}
|
||||
|
||||
[Java.Interop.Export("SignUpMainScreen")]
|
||||
public void MainScreenSignUp(View v)
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranRejestracji);
|
||||
}
|
||||
|
||||
[Java.Interop.Export("GoToMainScreenFromInformation")]
|
||||
public void GoToMainScreenFromInformation(View v)
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranStartowy);
|
||||
}
|
||||
[Java.Interop.Export("LoadFromFolder")]
|
||||
public void LoadFile(View v)
|
||||
{
|
||||
Intent = new Android.Content.Intent();
|
||||
Intent.SetType("image/*");
|
||||
Intent.SetAction(Android.Content.Intent.ActionGetContent);
|
||||
|
||||
StartActivityForResult(Android.Content.Intent.CreateChooser(Intent, "Select Picture"), PickImageId);
|
||||
}
|
||||
|
||||
[Java.Interop.Export("LoadFromCamera")]
|
||||
public void LoadFromCamera(View v)
|
||||
{
|
||||
Intent intent = new Intent(MediaStore.ActionImageCapture);
|
||||
StartActivityForResult(intent, 0);
|
||||
|
||||
}
|
||||
|
||||
|
||||
[Java.Interop.Export("GoToStart")]
|
||||
public void GoToStart(View v)
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranStartowy);
|
||||
}
|
||||
[Java.Interop.Export("GoToPoLogowaniu")]
|
||||
public void GoToPoLogowaniu(View v)
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranPoLogowaniu);
|
||||
}
|
||||
|
||||
protected override void OnActivityResult(int requestCode, Result resultCode, Android.Content.Intent data)
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranPoZdjeciu);
|
||||
FindViewById<TextView>(Resource.Id.ErrorPhoto).Text = "";
|
||||
if (requestCode == 0)
|
||||
{
|
||||
photo = data;
|
||||
base.OnActivityResult(requestCode, resultCode, data);
|
||||
if (data != null)
|
||||
{
|
||||
bitmap = (Bitmap)data.Extras.Get("data");
|
||||
|
||||
byte[] bitmapData;
|
||||
var stream = new MemoryStream();
|
||||
bitmap.Compress(Bitmap.CompressFormat.Png, 100, stream);
|
||||
bitmapData = stream.ToArray();
|
||||
fileContent = new ByteArrayContent(bitmapData);
|
||||
|
||||
|
||||
FindViewById<ImageView>(Resource.Id.Preview).SetImageBitmap(bitmap);
|
||||
}
|
||||
else SetContentView(Resource.Layout.ekranPoLogowaniu);
|
||||
|
||||
}
|
||||
else if(requestCode == PickImageId)
|
||||
{
|
||||
if(data == null) SetContentView(Resource.Layout.ekranPoLogowaniu);
|
||||
else
|
||||
{
|
||||
Android.Net.Uri uri = data.Data;
|
||||
photo = data;
|
||||
FindViewById<ImageView>(Resource.Id.Preview).SetImageURI(uri);
|
||||
}
|
||||
}
|
||||
else if(data == null)
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranPoLogowaniu);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
[Java.Interop.Export("SendPhoto")]
|
||||
async public void UploadPhoto(View v)
|
||||
{
|
||||
if(photo.Data == null)
|
||||
{
|
||||
fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");
|
||||
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
|
||||
{
|
||||
Name = "image",
|
||||
FileName = Guid.NewGuid().ToString()
|
||||
};
|
||||
|
||||
string boundary = "---8d0f01e6b3b5dafaaadaad";
|
||||
MultipartFormDataContent formDataContent = new MultipartFormDataContent(boundary);
|
||||
formDataContent.Add(fileContent);
|
||||
|
||||
var response = await client.PostAsync("https://pixblocksaddition.azurewebsites.net/api/Image/Process", formDataContent);
|
||||
if (response.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
var jsonString = await response.Content.ReadAsStringAsync();
|
||||
FindViewById<TextView>(Resource.Id.ErrorPhoto).Text = "Przesłano zdjęcie!";
|
||||
SetContentView(Resource.Layout.ekranZLinkami);
|
||||
var second_response = await client.GetAsync($"https://pixblocksaddition.azurewebsites.net/api/Search/{jsonString}");
|
||||
if (second_response.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
var second_jsonString = await response.Content.ReadAsStringAsync();
|
||||
|
||||
List<SearchResult> fullLink = JsonConvert.DeserializeObject<List<SearchResult>>(second_jsonString);
|
||||
|
||||
int end = 10;
|
||||
if (fullLink.Count < 10) end = fullLink.Count;
|
||||
for (int i = 0; i < end; i++)
|
||||
{
|
||||
FindViewById<TextView>(Resource.Id.links).Text = FindViewById<TextView>(Resource.Id.links).Text + fullLink[i].title + ": \n" + fullLink[i].link + "\n\n";
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
FindViewById<TextView>(Resource.Id.links).Text = "Coś poszło nie tak!";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
string msg = await response.Content.ReadAsStringAsync();
|
||||
FindViewById<TextView>(Resource.Id.ErrorPhoto).Text = msg;
|
||||
}
|
||||
}
|
||||
|
||||
using(var imageStream = ContentResolver.OpenInputStream(photo.Data))
|
||||
using(var stramContent = new StreamContent(imageStream))
|
||||
using(var byteArrayContent = new ByteArrayContent(await stramContent.ReadAsByteArrayAsync()))
|
||||
using(var formDataContent = new MultipartFormDataContent())
|
||||
{
|
||||
formDataContent.Add(byteArrayContent, "image", Guid.NewGuid() + ".jpg");
|
||||
foreach (var content in formDataContent)
|
||||
{
|
||||
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(ContentResolver.GetType(photo.Data));
|
||||
break;
|
||||
}
|
||||
var response = await client.PostAsync("https://pixblocksaddition.azurewebsites.net/api/Image/Process", formDataContent);
|
||||
if(response.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
var jsonString = await response.Content.ReadAsStringAsync();
|
||||
FindViewById<TextView>(Resource.Id.ErrorPhoto).Text = "Przesłano zdjęcie!";
|
||||
SetContentView(Resource.Layout.ekranZLinkami);
|
||||
var second_response = await client.GetAsync($"https://pixblocksaddition.azurewebsites.net/api/Search/{jsonString}");
|
||||
if(second_response.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
var second_jsonString = await second_response.Content.ReadAsStringAsync();
|
||||
List<SearchResult> fullLink = JsonConvert.DeserializeObject<List<SearchResult>>(second_jsonString);
|
||||
|
||||
int end = 10;
|
||||
if (fullLink.Count < 10) end = fullLink.Count;
|
||||
for (int i = 0; i < end; i++)
|
||||
{
|
||||
FindViewById<TextView>(Resource.Id.links).Text = FindViewById<TextView>(Resource.Id.links).Text + fullLink[i].title + ": " + fullLink[i].link + "\n\n";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FindViewById<TextView>(Resource.Id.links).Text = "Coś poszło nie tak!";
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
string msg = await response.Content.ReadAsStringAsync();
|
||||
FindViewById<TextView>(Resource.Id.ErrorPhoto).Text = msg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Java.Interop.Export("GoToProfil")]
|
||||
public void GoToProfile(View v)
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranProfil);
|
||||
FindViewById<EditText>(Resource.Id.ChangeName).Text = savedName;
|
||||
FindViewById<EditText>(Resource.Id.ChangeSurname).Text = savedSurname;
|
||||
FindViewById<EditText>(Resource.Id.ChangeEmail).Text = savedEmail;
|
||||
FindViewById<TextView>(Resource.Id.ProfilPageLogin).Text = savedLogin;
|
||||
}
|
||||
|
||||
[Java.Interop.Export("Save")]
|
||||
public async void SaveChanges(View v)
|
||||
{
|
||||
var Name = FindViewById<EditText>(Resource.Id.ChangeName).Text;
|
||||
var Surname = FindViewById<EditText>(Resource.Id.ChangeSurname).Text;
|
||||
var Email = FindViewById<EditText>(Resource.Id.ChangeEmail).Text;
|
||||
|
||||
if (string.IsNullOrEmpty(Name))
|
||||
{
|
||||
Name = savedName;
|
||||
}
|
||||
if (string.IsNullOrEmpty(Email))
|
||||
{
|
||||
Email = savedEmail;
|
||||
}
|
||||
if (string.IsNullOrEmpty(Surname))
|
||||
{
|
||||
Surname = savedSurname;
|
||||
}
|
||||
var values = new Dictionary<string, string>
|
||||
{
|
||||
{ "id", userId },
|
||||
{ "email", Email },
|
||||
{ "name", Name },
|
||||
{ "surname", Surname },
|
||||
{ "login", savedLogin }
|
||||
};
|
||||
var content = new FormUrlEncodedContent(values);
|
||||
var response = await client.PostAsync("https://pixblocksaddition.azurewebsites.net/api/User/Update", content);
|
||||
|
||||
if (response.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
FindViewById<TextView>(Resource.Id.NullValueProfile).Text = "Zapisano!";
|
||||
var jsonString = await response.Content.ReadAsStringAsync();
|
||||
dynamic jsonObject = JsonConvert.DeserializeObject(jsonString);
|
||||
savedLogin = jsonObject.login;
|
||||
savedName = jsonObject.name;
|
||||
savedEmail = jsonObject.email;
|
||||
savedSurname = jsonObject.surname;
|
||||
}
|
||||
else
|
||||
{
|
||||
string msg = await response.Content.ReadAsStringAsync();
|
||||
FindViewById<TextView>(Resource.Id.NullValueProfile).Text = msg;
|
||||
}
|
||||
}
|
||||
|
||||
[Java.Interop.Export("GetHistory")]
|
||||
public async void GetUserHistory(View v)
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranHistorii);
|
||||
var response = await client.GetAsync("https://pixblocksaddition.azurewebsites.net/api/History");
|
||||
if (response.StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
var jsonString = await response.Content.ReadAsStringAsync();
|
||||
dynamic jsonObject = JsonConvert.DeserializeObject(jsonString);
|
||||
var hs = (JArray)jsonObject.history;
|
||||
List<string> history = hs.ToObject<List<string>>();
|
||||
int end = 10;
|
||||
int temp;
|
||||
if (history.Count < 10) end = history.Count;
|
||||
for (int i = 0; i < end; i++)
|
||||
{
|
||||
temp = i + 1;
|
||||
FindViewById<TextView>(Resource.Id.history).Text = FindViewById<TextView>(Resource.Id.history).Text + "\n" + temp + ". " + history[i];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
string msg = await response.Content.ReadAsStringAsync();
|
||||
FindViewById<TextView>(Resource.Id.HistoryError).Text = msg;
|
||||
}
|
||||
}
|
||||
|
||||
[Java.Interop.Export("HelpPhoto")]
|
||||
public void GotToHelpPhoto(View v)
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranPomocZdjecie);
|
||||
}
|
||||
|
||||
[Java.Interop.Export("LogOut")]
|
||||
public void LogOut(View v)
|
||||
{
|
||||
SetContentView(Resource.Layout.ekranStartowy);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
20
Klient/Klient/Klient.Android/Modules/SearchResult.cs
Normal file
20
Klient/Klient/Klient.Android/Modules/SearchResult.cs
Normal file
@ -0,0 +1,20 @@
|
||||
using Android.App;
|
||||
using Android.Content;
|
||||
using Android.OS;
|
||||
using Android.Runtime;
|
||||
using Android.Views;
|
||||
using Android.Widget;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace Klient.Droid.Modules
|
||||
{
|
||||
public class SearchResult
|
||||
{
|
||||
public string title { get; set; }
|
||||
public string link { get; set; }
|
||||
public string snippet { get; set; }
|
||||
}
|
||||
}
|
@ -35,6 +35,8 @@
|
||||
<AndroidEnableProfiledAot>false</AndroidEnableProfiledAot>
|
||||
<BundleAssemblies>false</BundleAssemblies>
|
||||
<MandroidI18n />
|
||||
<Debugger>Xamarin</Debugger>
|
||||
<AndroidSupportedAbis />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
@ -47,6 +49,7 @@
|
||||
<AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="Mono.Android" />
|
||||
<Reference Include="Mono.Android.Export" />
|
||||
<Reference Include="System" />
|
||||
@ -56,6 +59,9 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Newtonsoft.Json">
|
||||
<Version>12.0.3</Version>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Xamarin.Essentials">
|
||||
<Version>1.5.3.2</Version>
|
||||
</PackageReference>
|
||||
@ -68,6 +74,7 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="MainActivity.cs" />
|
||||
<Compile Include="Modules\SearchResult.cs" />
|
||||
<Compile Include="Resources\Resource.designer.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
@ -93,12 +100,10 @@
|
||||
<AndroidResource Include="Resources\mipmap-xxxhdpi\launcher_foreground.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Modules\" />
|
||||
<Folder Include="Resources\drawable-hdpi\" />
|
||||
<Folder Include="Resources\drawable-xhdpi\" />
|
||||
<Folder Include="Resources\drawable-xxhdpi\" />
|
||||
<Folder Include="Resources\drawable-xxxhdpi\" />
|
||||
<Folder Include="Resources\drawable\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Klient\Klient.csproj">
|
||||
@ -116,6 +121,69 @@
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\ekranStartowy.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\ekranPoLogowaniu.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\Obraz2.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\Obraz1.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\ekranPoZdjeciu.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\Obraz3.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\ekranProfil.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\ekranPomocZdjecie.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\ekranHistorii.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\ekranInformacji.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\ekranZLinkami.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\layout\ekranPomocRejestracja.xml">
|
||||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\Obraz4.png" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\xml\file_paths.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\Obraz8.png" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
|
||||
<ProjectExtensions>
|
||||
<VisualStudio>
|
||||
|
@ -1,5 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.Klient.Android">
|
||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
|
||||
<application android:label="Klient.Android"></application>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.Klient.Android" android:installLocation="internalOnly">
|
||||
<uses-sdk android:minSdkVersion="28" android:targetSdkVersion="27" />
|
||||
<application android:label="Klient.Android" android:usesCleartextTraffic="true" android:theme="@style/Base.Theme.AppCompat.Light.DarkActionBar" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
</manifest>
|
@ -15,6 +15,7 @@ using Android.App;
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
[assembly: ComVisible(false)]
|
||||
[assembly: Application(Theme = "@style/Base.Theme.AppCompat.Light.DarkActionBar")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
|
1545
Klient/Klient/Klient.Android/Resources/Resource.designer.cs
generated
1545
Klient/Klient/Klient.Android/Resources/Resource.designer.cs
generated
File diff suppressed because it is too large
Load Diff
BIN
Klient/Klient/Klient.Android/Resources/drawable/Obraz1.png
Normal file
BIN
Klient/Klient/Klient.Android/Resources/drawable/Obraz1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 982 B |
BIN
Klient/Klient/Klient.Android/Resources/drawable/Obraz2.png
Normal file
BIN
Klient/Klient/Klient.Android/Resources/drawable/Obraz2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
BIN
Klient/Klient/Klient.Android/Resources/drawable/Obraz3.png
Normal file
BIN
Klient/Klient/Klient.Android/Resources/drawable/Obraz3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 925 B |
BIN
Klient/Klient/Klient.Android/Resources/drawable/Obraz4.png
Normal file
BIN
Klient/Klient/Klient.Android/Resources/drawable/Obraz4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 361 B |
BIN
Klient/Klient/Klient.Android/Resources/drawable/Obraz8.png
Normal file
BIN
Klient/Klient/Klient.Android/Resources/drawable/Obraz8.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 730 B |
@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#ffbdd7f0">
|
||||
<ImageButton
|
||||
android:src="@drawable/obraz4"
|
||||
android:layout_width="38.5dp"
|
||||
android:layout_height="35.0dp"
|
||||
android:id="@+id/backHistory"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:background="#ffbdd7f0"
|
||||
android:gravity="center"
|
||||
android:onClick="GoToPoLogowaniu" />
|
||||
<TextView
|
||||
android:text="Poszukiwacz 2021"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/text3"
|
||||
android:textColor="#ff000000"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerHorizontal="true"/>
|
||||
<TextView
|
||||
android:text="Historia wyszukiwań"
|
||||
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/HistoryTitle"
|
||||
android:textStyle="bold"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:textSize="30dp"
|
||||
android:paddingTop="5dp"
|
||||
android:textColor="#ff000000" />
|
||||
<TextView
|
||||
android:text=""
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/history"
|
||||
android:layout_below="@+id/HistoryError"
|
||||
android:textColor="#ff000000"
|
||||
android:paddingBottom="35dp"
|
||||
android:focusableInTouchMode="true"
|
||||
android:isScrollContainer="true"
|
||||
android:fadeScrollbars="true"
|
||||
android:scrollbars="vertical"
|
||||
android:verticalScrollbarPosition="right"
|
||||
android:scrollIndicators="right"
|
||||
android:scrollbarAlwaysDrawVerticalTrack="true"
|
||||
android:textIsSelectable="true"
|
||||
android:paddingTop="10dp"/>
|
||||
<TextView
|
||||
android:text=""
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/HistoryError"
|
||||
android:layout_below="@+id/HistoryTitle"
|
||||
android:textColor="#ffff0000"
|
||||
android:layout_centerInParent="true"
|
||||
android:paddingTop="10dp" />
|
||||
|
||||
</RelativeLayout>
|
@ -0,0 +1,60 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#ffbdd7f0"
|
||||
android:paddingTop="30dp">
|
||||
<TextView
|
||||
android:text="Poszukiwacz"
|
||||
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/title"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:textSize="50dp"
|
||||
android:textStyle="bold"
|
||||
android:textColor="#ff000000" />
|
||||
<TextView
|
||||
android:text="Poszukiwacz jest aplikacją mobilną pozwalającą na wyszukiwanie w Internece stron zawierających schematy i tutoriale na podstawie treści zadania. \n Jednocześnie pomaga w nauce, jaki i przyśpiesza proces dokonywania researchu danych. "
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/textView1"
|
||||
android:layout_below="@id/title"
|
||||
android:layout_centerInParent="true"
|
||||
android:gravity="center_horizontal"
|
||||
android:textColor="#ff373737" />
|
||||
<TextView
|
||||
android:text="Poszukiwacz 2021"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/text1"
|
||||
android:textColor="#ff000000"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerHorizontal="true" />
|
||||
<ImageButton
|
||||
android:src="@drawable/obraz4"
|
||||
android:layout_width="38.5dp"
|
||||
android:layout_height="35.0dp"
|
||||
android:id="@+id/backInformation"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:background="#ffbdd7f0"
|
||||
android:gravity="center"
|
||||
android:onClick="GoToMainScreenFromInformation" />
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
|
||||
|
@ -8,70 +8,79 @@
|
||||
android:layout_height="match_parent"
|
||||
android:background="#ffbdd7f0"
|
||||
>
|
||||
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:id="@+id/Login"
|
||||
android:layout_alignParentStart="false"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:layout_centerInParent="false"
|
||||
<android.support.design.widget.TextInputLayout
|
||||
android:id="@+id/LayoutLogin"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:hint="Login"
|
||||
android:gravity="center_horizontal|center_vertical"
|
||||
android:textColor="#ff000000"
|
||||
android:textColorHint="#ff6c6767" />
|
||||
android:hint="Login">
|
||||
<EditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:id="@+id/Login"
|
||||
android:layout_alignParentStart="false"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:layout_centerInParent="false"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_alignParentTop="true"
|
||||
android:inputType="text"
|
||||
android:textColor="#ff000000"
|
||||
android:textColorHint="#ff6c6767" />
|
||||
</android.support.design.widget.TextInputLayout>
|
||||
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:id="@+id/Password"
|
||||
<android.support.design.widget.TextInputLayout
|
||||
android:id="@+id/LayoutPassword"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:passwordToggleEnabled="true"
|
||||
android:layout_below="@+id/LayoutLogin"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_below="@+id/Login"
|
||||
app:passwordToggleTint="@android:color/darker_gray"
|
||||
android:hint="Hasło"
|
||||
android:gravity="center_horizontal|center_vertical"
|
||||
android:inputType="none|textPassword"
|
||||
android:textColor="#ff000000"
|
||||
android:textColorHint="#ff6c6767" />
|
||||
android:gravity="left">
|
||||
<EditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:id="@+id/Password"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_below="@+id/Login"
|
||||
android:inputType="none|textPassword"
|
||||
android:textColor="#ff000000"
|
||||
android:textColorHint="#ff6c6767" />
|
||||
</android.support.design.widget.TextInputLayout>
|
||||
<Button
|
||||
android:layout_width="100.5dp"
|
||||
android:layout_height="50dp"
|
||||
android:id="@+id/In"
|
||||
android:layout_below="@id/Password"
|
||||
android:layout_below="@id/LayoutPassword"
|
||||
android:layout_alignParentRight="false"
|
||||
android:gravity="center"
|
||||
android:onClick="SignIn"
|
||||
android:text="Zaloguj"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:foregroundGravity="center" />
|
||||
<Button
|
||||
android:text=" Reset \n Hasła"
|
||||
android:layout_width="100.5dp"
|
||||
android:layout_height="50dp"
|
||||
android:id="@+id/Reset"
|
||||
android:gravity="center"
|
||||
android:layout_below="@id/In"
|
||||
android:layout_alignParentRight="false"
|
||||
android:autoSizeTextType="uniform"
|
||||
android:onClick="ResetPassword"
|
||||
android:textColor="#ff790000"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:foregroundGravity="center" />
|
||||
<Button
|
||||
android:text="?"
|
||||
android:layout_width="35.0dp"
|
||||
<ImageButton
|
||||
android:src="@drawable/obraz4"
|
||||
android:layout_width="38.5dp"
|
||||
android:layout_height="35.0dp"
|
||||
android:id="@+id/help"
|
||||
android:id="@+id/backLogowanie"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:background="#ff0b31c8"
|
||||
android:textColor="#fffcfcfc"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:background="#ffbdd7f0"
|
||||
android:gravity="center"
|
||||
android:onClick="HelpLoginScreen" />
|
||||
android:onClick="GoToStart"/>
|
||||
<TextView
|
||||
android:text="Poszukiwacz 2020"
|
||||
android:text=""
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/ErrorLogIn"
|
||||
android:textColor="#ffd60000"
|
||||
android:layout_below="@id/In"
|
||||
android:layout_centerHorizontal="true" />
|
||||
<TextView
|
||||
android:text="Poszukiwacz 2021"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
@ -79,15 +88,5 @@
|
||||
android:textColor="#ff000000"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerHorizontal="true" />
|
||||
<Switch
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/LoginPasswordSee"
|
||||
android:layout_below="@id/Login"
|
||||
android:layout_toRightOf="@id/Password" />
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</RelativeLayout>
|
||||
|
@ -0,0 +1,76 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#ffbdd7f0">
|
||||
<ImageButton
|
||||
android:src="@drawable/Obraz1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:minWidth="80px"
|
||||
android:minHeight="80px"
|
||||
android:id="@+id/LoadFromFolder"
|
||||
android:contentDescription="Wybieranie z pliku"
|
||||
android:background="#ffbdd7f0"
|
||||
android:layout_below="@+id/text5"
|
||||
android:layout_alignParentRight="false"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_marginLeft="75dp"
|
||||
android:onClick="LoadFromFolder" />
|
||||
<TextView
|
||||
android:text="Poszukiwacz 2021"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/text3"
|
||||
android:textColor="#ff000000"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerHorizontal="true" />
|
||||
<TextView
|
||||
android:text="Załaduj zdjęcie"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/text5"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_marginVertical="100dp"
|
||||
android:textSize="45dp"
|
||||
android:textColor="#ff000000"
|
||||
android:gravity="center" />
|
||||
<ImageButton
|
||||
android:src="@drawable/obraz2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/LoadFromCamera"
|
||||
android:contentDescription="Zrób zdjęcie"
|
||||
android:background="#ffbdd7f0"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_below="@+id/text5"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_marginRight="75dp"
|
||||
android:onClick="LoadFromCamera" />
|
||||
<Button
|
||||
android:text="?"
|
||||
android:layout_width="25.0dp"
|
||||
android:layout_height="25.0dp"
|
||||
android:id="@+id/helpPhoto"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:background="#ff0b31c8"
|
||||
android:textColor="#fffcfcfc"
|
||||
android:gravity="center"
|
||||
android:onClick="HelpPhoto" />
|
||||
<ImageButton
|
||||
android:src="@drawable/obraz3"
|
||||
android:layout_width="63.5dp"
|
||||
android:layout_height="70.5dp"
|
||||
android:background="#ffbdd7f0"
|
||||
android:id="@+id/Profile"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:onClick="GoToProfil"/>
|
||||
|
||||
</RelativeLayout>
|
@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#ffbdd7f0">
|
||||
<ImageView
|
||||
android:src="@android:drawable/ic_menu_gallery"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="217.5dp"
|
||||
android:minWidth="100px"
|
||||
android:minHeight="100px"
|
||||
android:id="@+id/Preview" />
|
||||
<Button
|
||||
android:text="Wyślij zdjęcie"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/SendPhoto"
|
||||
android:onClick="SendPhoto"
|
||||
android:layout_below="@id/Preview" />
|
||||
<TextView
|
||||
android:text=""
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/ErrorPhoto"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_below="@id/SendPhoto"
|
||||
android:textColor="#ffd60000" />
|
||||
<ImageButton
|
||||
android:src="@drawable/obraz4"
|
||||
android:layout_width="38.5dp"
|
||||
android:layout_height="35.0dp"
|
||||
android:id="@+id/backZdjecie"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:background="#ffbdd7f0"
|
||||
android:gravity="center"
|
||||
android:onClick="GoToPoLogowaniu" />
|
||||
<TextView
|
||||
android:text="Poszukiwacz 2021"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/text1"
|
||||
android:textColor="#ff000000"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerHorizontal="true" />
|
||||
</RelativeLayout>
|
@ -0,0 +1,70 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#ffbdd7f0">
|
||||
<TextView
|
||||
android:text="Login powinien składać się z 3 do 12 znaków!"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/loginTip"
|
||||
android:paddingTop="20dp"
|
||||
android:textColor="#ff000000" />
|
||||
<TextView
|
||||
android:text="Hasło musi się składać z 8 do 20 znaków!"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/passwordTip"
|
||||
android:layout_below="@+id/loginTip"
|
||||
android:paddingTop="10dp"
|
||||
android:textColor="#ff000000" />
|
||||
<TextView
|
||||
android:text="Wszystkie pola formularza są wymagane!"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/GeneralTip"
|
||||
android:layout_below="@+id/passwordTip"
|
||||
android:paddingTop="10dp"
|
||||
android:textColor="#ff000000" />
|
||||
<TextView
|
||||
android:text="To jest pomoc \n w rejestracji \n co miałem \n napisac"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/textView1"
|
||||
android:textColor="#ffb1d5f8"
|
||||
android:layout_alignParentRight="true"
|
||||
android:layout_alignParentBottom="true" />
|
||||
<TextView
|
||||
android:text="Poszukiwacz 2021"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/text1"
|
||||
android:textColor="#ff000000"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerHorizontal="true" />
|
||||
<ImageButton
|
||||
android:src="@drawable/obraz4"
|
||||
android:layout_width="38.5dp"
|
||||
android:layout_height="35.0dp"
|
||||
android:id="@+id/backRegisterHelp"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:background="#ffbdd7f0"
|
||||
android:gravity="center"
|
||||
android:onClick="GoToRegister" />
|
||||
|
||||
</RelativeLayout>
|
@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#ffbdd7f0">
|
||||
<TextView
|
||||
android:text="Poszukiwacz 2021"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/text1"
|
||||
android:textColor="#ff000000"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerHorizontal="true" />
|
||||
<ImageButton
|
||||
android:src="@drawable/obraz4"
|
||||
android:layout_width="38.5dp"
|
||||
android:layout_height="35.0dp"
|
||||
android:id="@+id/backPomocZdjecie"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:background="#ffbdd7f0"
|
||||
android:gravity="center"
|
||||
android:onClick="GoToPoLogowaniu" />
|
||||
<TextView
|
||||
android:text="W celu załadowania zdjęcia z pamięci telefonu \nwybierz ikonę folderu, w celu zrobienia zdjęcia \nwybierz ikonę aparatu i postępuj jak przy robieniu zdjęcia. \nNa następnym ekranie zostanie wyświtlony \npodgląd załadowanego zdjęcia."
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/textView1"
|
||||
android:textColor="#ff000000" />
|
||||
|
||||
</RelativeLayout>
|
132
Klient/Klient/Klient.Android/Resources/layout/ekranProfil.xml
Normal file
132
Klient/Klient/Klient.Android/Resources/layout/ekranProfil.xml
Normal file
@ -0,0 +1,132 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#ffbdd7f0">
|
||||
<TextView
|
||||
android:text=""
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/ProfilPageLogin"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:textStyle="bold"
|
||||
android:textSize="30dp" />
|
||||
<android.support.design.widget.TextInputLayout
|
||||
android:id="@+id/LayoutNameC"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_below="@id/ProfilPageLogin"
|
||||
android:hint="Imie"
|
||||
android:layout_alignParentLeft="true">
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/ChangeName"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:capitalize="words"
|
||||
android:textColorHint="#ff6c6767"
|
||||
android:textColor="#ff000000"
|
||||
android:inputType="none|textPersonName" />
|
||||
</android.support.design.widget.TextInputLayout>
|
||||
|
||||
<android.support.design.widget.TextInputLayout
|
||||
android:id="@+id/LayoutSurnameC"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:hint="Nazwisko"
|
||||
android:layout_below="@id/LayoutNameC"
|
||||
android:layout_alignParentLeft="true">
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/ChangeSurname"
|
||||
android:textColorHint="#ff6c6767"
|
||||
android:textColor="#ff000000"
|
||||
android:inputType="none|textPersonName" />
|
||||
</android.support.design.widget.TextInputLayout>
|
||||
<android.support.design.widget.TextInputLayout
|
||||
android:id="@+id/LayoutEmailC"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:hint="Adres email"
|
||||
android:layout_below="@id/LayoutSurnameC"
|
||||
android:layout_alignParentLeft="true">
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/ChangeEmail"
|
||||
android:textColorHint="#ff6c6767"
|
||||
android:textColor="#ff000000"
|
||||
android:inputType="none|textEmailAddress" />
|
||||
</android.support.design.widget.TextInputLayout>
|
||||
<Button
|
||||
android:text="Zapisz"
|
||||
android:layout_width="100.5dp"
|
||||
android:layout_height="50dp"
|
||||
android:id="@+id/Save"
|
||||
android:layout_below="@id/LayoutEmailC"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:foregroundGravity="center"
|
||||
android:gravity="center"
|
||||
android:onClick="Save"/>
|
||||
<TextView
|
||||
android:text=""
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/NullValueProfile"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:layout_below="@id/Save"
|
||||
android:textColor="#ffd60000" />
|
||||
<TextView
|
||||
android:text="Poszukiwacz 2021"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/text3"
|
||||
android:textColor="#ff000000"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerHorizontal="true" />
|
||||
<ImageButton
|
||||
android:src="@drawable/obraz4"
|
||||
android:layout_width="38.5dp"
|
||||
android:layout_height="35.0dp"
|
||||
android:id="@+id/backProfil"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:background="#ffbdd7f0"
|
||||
android:gravity="center"
|
||||
android:onClick="GoToPoLogowaniu" />
|
||||
<Button
|
||||
android:text="Historia"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/GetHistory"
|
||||
android:layout_below="@id/Save"
|
||||
android:translationY="45dp"
|
||||
android:onClick="GetHistory" />
|
||||
<ImageButton
|
||||
android:src="@drawable/obraz8"
|
||||
android:layout_width="35.0dp"
|
||||
android:layout_height="35.0dp"
|
||||
android:background="#ffbdd7f0"
|
||||
android:id="@+id/LogOut"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:onClick="LogOut" />
|
||||
</RelativeLayout>
|
@ -1,96 +1,127 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#ffbdd7f0">
|
||||
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/Name"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:capitalize="words"
|
||||
android:textColorHint="#ff6c6767"
|
||||
android:textColor="#ff000000"
|
||||
<android.support.design.widget.TextInputLayout
|
||||
android:id="@+id/LayoutName"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:hint="Imie"
|
||||
android:gravity="center"
|
||||
android:inputType="none|textPersonName" />
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/Surname"
|
||||
android:layout_alignParentLeft="true">
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/Name"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:capitalize="words"
|
||||
android:textColorHint="#ff6c6767"
|
||||
android:textColor="#ff000000"
|
||||
android:inputType="none|textPersonName" />
|
||||
</android.support.design.widget.TextInputLayout>
|
||||
|
||||
<android.support.design.widget.TextInputLayout
|
||||
android:id="@+id/LayoutSurname"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:hint="Nazwisko"
|
||||
android:textColorHint="#ff6c6767"
|
||||
android:layout_below="@id/Name"
|
||||
android:gravity="center"
|
||||
android:textColor="#ff000000"
|
||||
android:inputType="none|textPersonName" />
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/Email"
|
||||
android:layout_below="@+id/NewLogin"
|
||||
android:hint="Email"
|
||||
android:gravity="center"
|
||||
android:textColorHint="#ff6c6767"
|
||||
android:textColor="#ff000000"
|
||||
android:inputType="none|textEmailAddress" />
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/NewPassword"
|
||||
android:layout_below="@id/LayoutName"
|
||||
android:layout_alignParentLeft="true">
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/Surname"
|
||||
android:textColorHint="#ff6c6767"
|
||||
android:layout_below="@id/Name"
|
||||
android:textColor="#ff000000"
|
||||
android:inputType="none|textPersonName" />
|
||||
</android.support.design.widget.TextInputLayout>
|
||||
<android.support.design.widget.TextInputLayout
|
||||
android:id="@+id/LayoutEmail"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:hint="Adres email"
|
||||
android:layout_below="@id/LayoutSurname"
|
||||
android:layout_alignParentLeft="true">
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/Email"
|
||||
android:textColorHint="#ff6c6767"
|
||||
android:textColor="#ff000000"
|
||||
android:inputType="none|textEmailAddress" />
|
||||
</android.support.design.widget.TextInputLayout>
|
||||
<android.support.design.widget.TextInputLayout
|
||||
android:id="@+id/LayoutNewPassword1"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
app:passwordToggleEnabled="true"
|
||||
app:passwordToggleTint="@android:color/darker_gray"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:hint="Hasło"
|
||||
android:layout_below="@+id/Email"
|
||||
android:gravity="center"
|
||||
android:inputType="none|textPassword"
|
||||
android:textColorHint="#ff6c6767" />
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/RepeatPassword"
|
||||
android:layout_below="@+id/NewPassword"
|
||||
android:layout_below="@id/LayoutEmail"
|
||||
android:layout_alignParentLeft="true">
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:textColor="#ff000000"
|
||||
android:textColorHint="#ff6c6767"
|
||||
android:id="@+id/NewPassword"
|
||||
android:inputType="none|textPassword" />
|
||||
</android.support.design.widget.TextInputLayout>
|
||||
<android.support.design.widget.TextInputLayout
|
||||
android:id="@+id/LayoutNewPassword2"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:hint="Powtórz hasło"
|
||||
android:inputType="none|textPassword"
|
||||
android:gravity="center"
|
||||
android:textColorHint="#ff6c6767"
|
||||
android:textColor="#ff000000" />
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/NewLogin"
|
||||
app:passwordToggleEnabled="true"
|
||||
app:passwordToggleTint="@android:color/darker_gray"
|
||||
android:layout_below="@id/LayoutNewPassword1"
|
||||
android:layout_alignParentLeft="true">
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/RepeatPassword"
|
||||
android:inputType="none|textPassword"
|
||||
android:textColor="#ff000000"
|
||||
android:textColorHint="#ff6c6767" />
|
||||
</android.support.design.widget.TextInputLayout>
|
||||
<android.support.design.widget.TextInputLayout
|
||||
android:id="@+id/LayoutNewLogin"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:hint="Login"
|
||||
android:gravity="center"
|
||||
android:textColorHint="#ff6c6767"
|
||||
android:textColor="#ff000000"
|
||||
android:layout_below="@+id/Surname" />
|
||||
<Switch
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/PasswordSee1"
|
||||
android:layout_toRightOf="@id/NewPassword"
|
||||
android:layout_below="@id/Email" />
|
||||
<Switch
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/PasswordSee2"
|
||||
android:layout_toRightOf="@id/RepeatPassword"
|
||||
android:layout_below="@id/NewPassword"
|
||||
android:checked="false" />
|
||||
android:layout_below="@id/LayoutNewPassword2"
|
||||
android:layout_alignParentLeft="true">
|
||||
<android.support.design.widget.TextInputEditText
|
||||
android:layout_width="204.0dp"
|
||||
android:layout_height="58.0dp"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/NewLogin"
|
||||
android:textColor="#ff000000"
|
||||
android:layout_below="@+id/Surname" />
|
||||
</android.support.design.widget.TextInputLayout>
|
||||
<Button
|
||||
android:text=" Załóż \n konto"
|
||||
android:layout_width="100.5dp"
|
||||
@ -98,21 +129,13 @@
|
||||
android:id="@+id/SignUp"
|
||||
android:autoSizeTextType="uniform"
|
||||
android:gravity="center"
|
||||
android:layout_below="@id/RepeatPassword"
|
||||
android:layout_below="@id/LayoutNewLogin"
|
||||
android:layout_alignParentRight="false"
|
||||
android:foregroundGravity="center"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:onClick="SignUp" />
|
||||
<TextView
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/text2"
|
||||
android:layout_below="@id/Email"
|
||||
android:layout_alignParentRight="false"
|
||||
android:layout_toRightOf="@id/NewPassword" />
|
||||
<TextView
|
||||
android:text="Poszukiwacz 2020"
|
||||
android:text="Poszukiwacz 2021"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
@ -120,7 +143,35 @@
|
||||
android:textColor="#ff000000"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerHorizontal="true" />
|
||||
|
||||
|
||||
<TextView
|
||||
android:text=""
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/ErrorRegister"
|
||||
android:textColor="#ffd60000"
|
||||
android:layout_below="@id/SignUp"
|
||||
android:layout_centerHorizontal="true" />
|
||||
<Button
|
||||
android:text="?"
|
||||
android:layout_width="25.0dp"
|
||||
android:layout_height="25.0dp"
|
||||
android:id="@+id/helpRegister"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:background="#ff0b31c8"
|
||||
android:textColor="#fffcfcfc"
|
||||
android:gravity="center"
|
||||
android:onClick="HelpRegisterScreen" />
|
||||
<ImageButton
|
||||
android:src="@drawable/obraz4"
|
||||
android:layout_width="38.5dp"
|
||||
android:layout_height="35.0dp"
|
||||
android:id="@+id/backRejestracja"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:background="#ffbdd7f0"
|
||||
android:gravity="center"
|
||||
android:onClick="GoToStart" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#ffbdd7f0">
|
||||
<TextView
|
||||
android:text="Poszukiwacz"
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/text4"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:textColor="#ff000000"
|
||||
android:textStyle="bold"
|
||||
android:textSize="45dp"
|
||||
android:layout_marginVertical="100dp" />
|
||||
<TextView
|
||||
android:text="Poszukiwacz 2021"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/text1"
|
||||
android:textColor="#ff000000"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerHorizontal="true" />
|
||||
<Button
|
||||
android:text="?"
|
||||
android:layout_width="25.0dp"
|
||||
android:layout_height="25.0dp"
|
||||
android:id="@+id/about"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentRight="true"
|
||||
android:background="#ff0b31c8"
|
||||
android:textColor="#fffcfcfc"
|
||||
android:gravity="center"
|
||||
android:onClick="HelpLoginScreen" />
|
||||
<Button
|
||||
android:text="Zaloguj"
|
||||
android:layout_width="200.0dp"
|
||||
android:layout_height="70.0dp"
|
||||
android:id="@+id/SignInMainScreen"
|
||||
android:layout_alignParentLeft="false"
|
||||
android:layout_centerInParent="true"
|
||||
android:onClick="SignInMainScreen" />
|
||||
<Button
|
||||
android:text="Stwórz konto"
|
||||
android:layout_width="200.0dp"
|
||||
android:layout_height="50.0dp"
|
||||
android:id="@+id/SignUpMainScreen"
|
||||
android:layout_centerInParent="true"
|
||||
android:layout_below="@+id/SignInMainScreen"
|
||||
android:layout_marginVertical="15dp"
|
||||
android:onClick="SignUpMainScreen" />
|
||||
|
||||
|
||||
</RelativeLayout>
|
@ -0,0 +1,70 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#ffbdd7f0">
|
||||
<TextView
|
||||
android:text="Proponowane materiały"
|
||||
android:textAppearance="?android:attr/textAppearanceLarge"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:minWidth="25px"
|
||||
android:minHeight="25px"
|
||||
android:id="@+id/linkTitle"
|
||||
android:textStyle="bold"
|
||||
android:layout_centerHorizontal="true"
|
||||
android:translationY="5dp"
|
||||
android:textColor="#ff000000" />
|
||||
<TextView
|
||||
android:text=""
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/links"
|
||||
android:layout_below="@+id/LinkError"
|
||||
android:textColor="#ff393939"
|
||||
android:linksClickable="true"
|
||||
android:autoLink="web"
|
||||
android:fadeScrollbars="true"
|
||||
android:scrollbars="vertical"
|
||||
android:verticalScrollbarPosition="right"
|
||||
android:scrollIndicators="right"
|
||||
android:paddingBottom="35dp"
|
||||
android:scrollbarAlwaysDrawVerticalTrack="true"
|
||||
android:isScrollContainer="true"
|
||||
android:textIsSelectable="true"
|
||||
android:focusableInTouchMode="true"
|
||||
android:paddingTop="10dp" />
|
||||
<TextView
|
||||
android:text=""
|
||||
android:textAppearance="?android:attr/textAppearanceMedium"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/linkTitle"
|
||||
android:id="@+id/LinkError"
|
||||
android:textColor="#ffff0000"
|
||||
android:layout_centerInParent="true"
|
||||
android:paddingTop="10dp" />
|
||||
<ImageButton
|
||||
android:src="@drawable/obraz4"
|
||||
android:layout_width="38.5dp"
|
||||
android:layout_height="35.0dp"
|
||||
android:id="@+id/backToSendPhoto"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:background="#ffbdd7f0"
|
||||
android:gravity="center"
|
||||
android:onClick="GoToPoLogowaniu" />
|
||||
<TextView
|
||||
android:text="Poszukiwacz 2021"
|
||||
android:textAppearance="?android:attr/textAppearanceSmall"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/text1"
|
||||
android:textColor="#ff000000"
|
||||
android:layout_alignParentBottom="true"
|
||||
android:layout_centerHorizontal="true" />
|
||||
</RelativeLayout>
|
@ -4,7 +4,7 @@
|
||||
<style name="MainTheme" parent="MainTheme.Base">
|
||||
</style>
|
||||
<!-- Base theme applied no matter what API -->
|
||||
<style name="MainTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
|
||||
<style name="MainTheme.Base" parent="Theme.AppCompat">
|
||||
<!--If you are using revision 22.1 please use just windowNoTitle. Without android:-->
|
||||
<item name="windowNoTitle">true</item>
|
||||
<!--We will be using the toolbar so no need to show ActionBar-->
|
||||
@ -20,6 +20,7 @@
|
||||
<!-- You can also set colorControlNormal, colorControlActivated
|
||||
colorControlHighlight and colorSwitchThumbNormal. -->
|
||||
<item name="windowActionModeOverlay">true</item>
|
||||
<item name="android:textColorHint">#ff000000</item>
|
||||
|
||||
<item name="android:datePickerDialogTheme">@style/AppCompatDialogStyle</item>
|
||||
</style>
|
||||
|
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<paths xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<cache-path name="my_images"
|
||||
path="path" />
|
||||
</paths>
|
18
Serwer/Serwer.Api/.config/dotnet-tools.json
Normal file
18
Serwer/Serwer.Api/.config/dotnet-tools.json
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"version": 1,
|
||||
"isRoot": true,
|
||||
"tools": {
|
||||
"dotnet-ef": {
|
||||
"version": "5.0.1",
|
||||
"commands": [
|
||||
"dotnet-ef"
|
||||
]
|
||||
},
|
||||
"swashbuckle.aspnetcore.cli": {
|
||||
"version": "5.6.3",
|
||||
"commands": [
|
||||
"swagger"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
28
Serwer/Serwer.Api/Controllers/HistoryController.cs
Normal file
28
Serwer/Serwer.Api/Controllers/HistoryController.cs
Normal file
@ -0,0 +1,28 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Serwer.Infrastructure.Services;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Api.Controllers
|
||||
{
|
||||
[Route("api/[controller]")]
|
||||
[ApiController]
|
||||
public class HistoryController: ControllerBase
|
||||
{
|
||||
private readonly IHistoryService _historyService;
|
||||
public HistoryController(IHistoryService historyService)
|
||||
{
|
||||
_historyService = historyService;
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpGet()]
|
||||
public async Task<IActionResult> Get()
|
||||
{
|
||||
var id = User.Identity.Name;
|
||||
var history = await _historyService.GetAsync(Guid.Parse(id));
|
||||
return Ok(history);
|
||||
}
|
||||
}
|
||||
}
|
39
Serwer/Serwer.Api/Controllers/ImageController.cs
Normal file
39
Serwer/Serwer.Api/Controllers/ImageController.cs
Normal file
@ -0,0 +1,39 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Serwer.Infrastructure.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Api.Controllers
|
||||
{
|
||||
[Route("api/[controller]")]
|
||||
[ApiController]
|
||||
public class ImageController : ControllerBase
|
||||
{
|
||||
private readonly IImageHandler _imageService;
|
||||
public ImageController(IImageHandler imageService)
|
||||
{
|
||||
_imageService = imageService;
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpPost("Process")]
|
||||
public async Task<IActionResult> Process([FromForm]IFormFile image)
|
||||
{
|
||||
if(image == null)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
using (var memoryStream = new MemoryStream())
|
||||
{
|
||||
await image.CopyToAsync(memoryStream);
|
||||
var response = await _imageService.Process(image.Name, image.ContentType, memoryStream.ToArray());
|
||||
return Ok(response);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
31
Serwer/Serwer.Api/Controllers/SearchController.cs
Normal file
31
Serwer/Serwer.Api/Controllers/SearchController.cs
Normal file
@ -0,0 +1,31 @@
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Serwer.Infrastructure.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Api.Controllers
|
||||
{
|
||||
[Route("api/[controller]")]
|
||||
[ApiController]
|
||||
public class SearchController : ControllerBase
|
||||
{
|
||||
private readonly ISearchService _searchService;
|
||||
public SearchController(ISearchService searchService)
|
||||
{
|
||||
_searchService = searchService;
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpGet("{query}")]
|
||||
public async Task<IActionResult> Search(string query)
|
||||
{
|
||||
var id = User.Identity.Name;
|
||||
var results = await _searchService.Search(Guid.Parse(id), query);
|
||||
return Ok(results);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,7 +1,9 @@
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Serwer.Infrastructure.DTO;
|
||||
using Serwer.Infrastructure.Services;
|
||||
using Serwer.Infrastructure.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@ -20,17 +22,25 @@ namespace Serwer.Api.Controllers
|
||||
}
|
||||
|
||||
[HttpPost("Register")]
|
||||
public async Task<IActionResult> Register(string email, string name, string surname, string login, string password)
|
||||
public async Task<IActionResult> Register([FromForm]RegisterModel request)
|
||||
{
|
||||
await _userService.RegisterAsync(email, name, surname, login, password);
|
||||
await _userService.RegisterAsync(request.Email, request.Name, request.Surname, request.Login, request.Password);
|
||||
|
||||
return Ok();
|
||||
}
|
||||
|
||||
[HttpPost("SignIn")]
|
||||
public async Task<IActionResult> SignIn(string login, string password)
|
||||
public async Task<IActionResult> SignIn([FromForm]SignInModel request)
|
||||
{
|
||||
var user = await _userService.SignInAsync(login, password);
|
||||
var user = await _userService.SignInAsync(request.Login, request.Password);
|
||||
return Ok(user);
|
||||
}
|
||||
|
||||
[Authorize]
|
||||
[HttpPost("Update")]
|
||||
public async Task<IActionResult> Update([FromForm]UpdateUserModel request)
|
||||
{
|
||||
var user = await _userService.UpdateAsync(request);
|
||||
return Ok(user);
|
||||
}
|
||||
|
||||
|
38
Serwer/Serwer.Api/Framework/ExceptionHandlerMiddleware.cs
Normal file
38
Serwer/Serwer.Api/Framework/ExceptionHandlerMiddleware.cs
Normal file
@ -0,0 +1,38 @@
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Api.Framework
|
||||
{
|
||||
public class ExceptionHandlerMiddleware
|
||||
{
|
||||
private readonly RequestDelegate _next;
|
||||
|
||||
public ExceptionHandlerMiddleware(RequestDelegate next)
|
||||
{
|
||||
_next = next;
|
||||
}
|
||||
|
||||
public async Task Invoke(HttpContext context)
|
||||
{
|
||||
try
|
||||
{
|
||||
await _next(context);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
await HandleExceptionAsync(context, ex);
|
||||
}
|
||||
}
|
||||
|
||||
private static Task HandleExceptionAsync(HttpContext context, Exception exception)
|
||||
{
|
||||
var statusCode = HttpStatusCode.BadRequest;
|
||||
context.Response.StatusCode = (int)statusCode;
|
||||
return context.Response.WriteAsync($"Błąd: {exception.Message}");
|
||||
}
|
||||
}
|
||||
}
|
@ -21,6 +21,7 @@ namespace Serwer.Api
|
||||
.ConfigureWebHostDefaults(webBuilder =>
|
||||
{
|
||||
webBuilder.UseStartup<Startup>();
|
||||
webBuilder.UseUrls("http://localhost:5001");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,80 @@
|
||||
{
|
||||
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
|
||||
"contentVersion": "1.0.0.0",
|
||||
"parameters": {
|
||||
"resourceGroupName": {
|
||||
"type": "string",
|
||||
"defaultValue": "PixBlocksAdditionResourceGroup",
|
||||
"metadata": {
|
||||
"_parameterType": "resourceGroup",
|
||||
"description": "Name of the resource group for the resource. It is recommended to put resources under same resource group for better tracking."
|
||||
}
|
||||
},
|
||||
"resourceGroupLocation": {
|
||||
"type": "string",
|
||||
"defaultValue": "centralus",
|
||||
"metadata": {
|
||||
"_parameterType": "location",
|
||||
"description": "Location of the resource group. Resource groups could have different location than resources."
|
||||
}
|
||||
},
|
||||
"resourceLocation": {
|
||||
"type": "string",
|
||||
"defaultValue": "[parameters('resourceGroupLocation')]",
|
||||
"metadata": {
|
||||
"_parameterType": "location",
|
||||
"description": "Location of the resource. By default use resource group's location, unless the resource provider is not supported there."
|
||||
}
|
||||
}
|
||||
},
|
||||
"resources": [
|
||||
{
|
||||
"type": "Microsoft.Resources/resourceGroups",
|
||||
"name": "[parameters('resourceGroupName')]",
|
||||
"location": "[parameters('resourceGroupLocation')]",
|
||||
"apiVersion": "2019-10-01"
|
||||
},
|
||||
{
|
||||
"type": "Microsoft.Resources/deployments",
|
||||
"name": "[concat(parameters('resourceGroupName'), 'Deployment', uniqueString(concat('SerwerApi', subscription().subscriptionId)))]",
|
||||
"resourceGroup": "[parameters('resourceGroupName')]",
|
||||
"apiVersion": "2019-10-01",
|
||||
"dependsOn": [
|
||||
"[parameters('resourceGroupName')]"
|
||||
],
|
||||
"properties": {
|
||||
"mode": "Incremental",
|
||||
"template": {
|
||||
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
|
||||
"contentVersion": "1.0.0.0",
|
||||
"resources": [
|
||||
{
|
||||
"name": "SerwerApiapi",
|
||||
"type": "Microsoft.ApiManagement/service",
|
||||
"location": "[parameters('resourceLocation')]",
|
||||
"properties": {},
|
||||
"sku": {
|
||||
"name": "Consumption",
|
||||
"capacity": 0
|
||||
},
|
||||
"identity": null,
|
||||
"apiVersion": "2019-12-01"
|
||||
},
|
||||
{
|
||||
"type": "Microsoft.ApiManagement/service/apis",
|
||||
"name": "SerwerApiapi/SerwerApi",
|
||||
"properties": {},
|
||||
"apiVersion": "2019-12-01",
|
||||
"dependsOn": [
|
||||
"SerwerApiapi"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"_dependencyType": "apis.azure"
|
||||
}
|
||||
}
|
@ -0,0 +1,113 @@
|
||||
{
|
||||
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
|
||||
"contentVersion": "1.0.0.0",
|
||||
"metadata": {
|
||||
"_dependencyType": "appService.windows"
|
||||
},
|
||||
"parameters": {
|
||||
"resourceGroupName": {
|
||||
"type": "string",
|
||||
"defaultValue": "PixBlocksAdditionResourceGroup",
|
||||
"metadata": {
|
||||
"description": "Name of the resource group for the resource. It is recommended to put resources under same resource group for better tracking."
|
||||
}
|
||||
},
|
||||
"resourceGroupLocation": {
|
||||
"type": "string",
|
||||
"defaultValue": "centralus",
|
||||
"metadata": {
|
||||
"description": "Location of the resource group. Resource groups could have different location than resources, however by default we use API versions from latest hybrid profile which support all locations for resource types we support."
|
||||
}
|
||||
},
|
||||
"resourceName": {
|
||||
"type": "string",
|
||||
"defaultValue": "PixBlocksAddition",
|
||||
"metadata": {
|
||||
"description": "Name of the main resource to be created by this template."
|
||||
}
|
||||
},
|
||||
"resourceLocation": {
|
||||
"type": "string",
|
||||
"defaultValue": "[parameters('resourceGroupLocation')]",
|
||||
"metadata": {
|
||||
"description": "Location of the resource. By default use resource group's location, unless the resource provider is not supported there."
|
||||
}
|
||||
}
|
||||
},
|
||||
"variables": {
|
||||
"appServicePlan_name": "[concat('Plan', uniqueString(concat(parameters('resourceName'), subscription().subscriptionId)))]",
|
||||
"appServicePlan_ResourceId": "[concat('/subscriptions/', subscription().subscriptionId, '/resourceGroups/', parameters('resourceGroupName'), '/providers/Microsoft.Web/serverFarms/', variables('appServicePlan_name'))]"
|
||||
},
|
||||
"resources": [
|
||||
{
|
||||
"type": "Microsoft.Resources/resourceGroups",
|
||||
"name": "[parameters('resourceGroupName')]",
|
||||
"location": "[parameters('resourceGroupLocation')]",
|
||||
"apiVersion": "2019-10-01"
|
||||
},
|
||||
{
|
||||
"type": "Microsoft.Resources/deployments",
|
||||
"name": "[concat(parameters('resourceGroupName'), 'Deployment', uniqueString(concat(parameters('resourceName'), subscription().subscriptionId)))]",
|
||||
"resourceGroup": "[parameters('resourceGroupName')]",
|
||||
"apiVersion": "2019-10-01",
|
||||
"dependsOn": [
|
||||
"[parameters('resourceGroupName')]"
|
||||
],
|
||||
"properties": {
|
||||
"mode": "Incremental",
|
||||
"template": {
|
||||
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
|
||||
"contentVersion": "1.0.0.0",
|
||||
"resources": [
|
||||
{
|
||||
"location": "[parameters('resourceLocation')]",
|
||||
"name": "[parameters('resourceName')]",
|
||||
"type": "Microsoft.Web/sites",
|
||||
"apiVersion": "2015-08-01",
|
||||
"tags": {
|
||||
"[concat('hidden-related:', variables('appServicePlan_ResourceId'))]": "empty"
|
||||
},
|
||||
"dependsOn": [
|
||||
"[variables('appServicePlan_ResourceId')]"
|
||||
],
|
||||
"kind": "app",
|
||||
"properties": {
|
||||
"name": "[parameters('resourceName')]",
|
||||
"kind": "app",
|
||||
"httpsOnly": true,
|
||||
"reserved": false,
|
||||
"serverFarmId": "[variables('appServicePlan_ResourceId')]",
|
||||
"siteConfig": {
|
||||
"metadata": [
|
||||
{
|
||||
"name": "CURRENT_STACK",
|
||||
"value": "dotnetcore"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"identity": {
|
||||
"type": "SystemAssigned"
|
||||
}
|
||||
},
|
||||
{
|
||||
"location": "[parameters('resourceLocation')]",
|
||||
"name": "[variables('appServicePlan_name')]",
|
||||
"type": "Microsoft.Web/serverFarms",
|
||||
"apiVersion": "2015-08-01",
|
||||
"sku": {
|
||||
"name": "S1",
|
||||
"tier": "Standard",
|
||||
"family": "S",
|
||||
"size": "S1"
|
||||
},
|
||||
"properties": {
|
||||
"name": "[variables('appServicePlan_name')]"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
@ -22,7 +22,7 @@
|
||||
"dotnetRunMessages": "true",
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "swagger",
|
||||
"applicationUrl": "https://localhost:5001;http://localhost:5000",
|
||||
"applicationUrl": "http://localhost:5001;https://localhost:5000",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
|
@ -0,0 +1,8 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"apis1": {
|
||||
"resourceId": "/subscriptions/[parameters('subscriptionId')]/resourceGroups/[parameters('resourceGroupName')]/providers/Microsoft.ApiManagement/service/SerwerApiapi/apis/SerwerApi",
|
||||
"type": "apis.azure"
|
||||
}
|
||||
}
|
||||
}
|
7
Serwer/Serwer.Api/Properties/serviceDependencies.json
Normal file
7
Serwer/Serwer.Api/Properties/serviceDependencies.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"apis1": {
|
||||
"type": "apis"
|
||||
}
|
||||
}
|
||||
}
|
@ -4,6 +4,10 @@
|
||||
<TargetFramework>net5.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Remove="wwwroot\tessdata\eng.traineddata" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.0" NoWarn="NU1605" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="5.0.0" NoWarn="NU1605" />
|
||||
@ -15,4 +19,8 @@
|
||||
<ProjectReference Include="..\Serwer.Infrastructure\Serwer.Infrastructure.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="wwwroot\tessdata\eng.traineddata" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@ -15,6 +15,7 @@ using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.IdentityModel.Tokens;
|
||||
using Microsoft.OpenApi.Models;
|
||||
using Serwer.Api.Framework;
|
||||
using Serwer.Core.Repositories;
|
||||
using Serwer.Infrastructure.Mappers;
|
||||
using Serwer.Infrastructure.Repositories;
|
||||
@ -25,12 +26,14 @@ namespace Serwer.Api
|
||||
{
|
||||
public class Startup
|
||||
{
|
||||
public Startup(IConfiguration configuration)
|
||||
public Startup(IConfiguration configuration, IWebHostEnvironment env)
|
||||
{
|
||||
Configuration = configuration;
|
||||
WebRootPath = env.WebRootPath;
|
||||
}
|
||||
|
||||
public IConfiguration Configuration { get; }
|
||||
protected string WebRootPath { get; set; }
|
||||
|
||||
// This method gets called by the runtime. Use this method to add services to the container.
|
||||
public void ConfigureServices(IServiceCollection services)
|
||||
@ -39,8 +42,30 @@ namespace Serwer.Api
|
||||
services.AddSwaggerGen(c =>
|
||||
{
|
||||
c.SwaggerDoc("v1", new OpenApiInfo { Title = "Serwer.Api", Version = "v1" });
|
||||
var jwtSecurityScheme = new OpenApiSecurityScheme
|
||||
{
|
||||
Scheme = "bearer",
|
||||
BearerFormat = "JWT",
|
||||
Name = "JWT Authentication",
|
||||
In = ParameterLocation.Header,
|
||||
Type = SecuritySchemeType.Http,
|
||||
Description = "Put **_ONLY_** your JWT Bearer token on textbox below!",
|
||||
|
||||
Reference = new OpenApiReference
|
||||
{
|
||||
Id = JwtBearerDefaults.AuthenticationScheme,
|
||||
Type = ReferenceType.SecurityScheme
|
||||
}
|
||||
};
|
||||
|
||||
c.AddSecurityDefinition(jwtSecurityScheme.Reference.Id, jwtSecurityScheme);
|
||||
c.AddSecurityRequirement(new OpenApiSecurityRequirement
|
||||
{
|
||||
{ jwtSecurityScheme, Array.Empty<string>() }
|
||||
});
|
||||
});
|
||||
|
||||
var hostEnviroment = new HostEnviroment { RootPath = WebRootPath };
|
||||
var jwtSettings = new JwtSettings()
|
||||
{
|
||||
Issuer = "PoszukiwaczInc",
|
||||
@ -60,26 +85,37 @@ namespace Serwer.Api
|
||||
};
|
||||
});
|
||||
|
||||
services.AddSingleton<IHostEnviroment>(hostEnviroment);
|
||||
services.AddSingleton<IMapper>(AutoMapperConfig.Initialize());
|
||||
services.AddSingleton<IJwtHandler, JwtHandler>(sp => new JwtHandler(jwtSettings));
|
||||
services.AddScoped<IUserRepository, UserRepository>();
|
||||
services.AddScoped<IHistoryRepository, HistoryRepository>();
|
||||
services.AddScoped<IImageHandler, ImageHandler>();
|
||||
services.AddScoped<IUserService, UserService>();
|
||||
services.AddScoped<IHistoryService, HistoryService>();
|
||||
services.AddScoped<ISearchService, SearchService>();
|
||||
}
|
||||
|
||||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
||||
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
||||
{
|
||||
app.UseCors(builder =>
|
||||
{
|
||||
builder.AllowAnyHeader();
|
||||
builder.AllowAnyMethod();
|
||||
builder.AllowAnyOrigin();
|
||||
});
|
||||
if (env.IsDevelopment())
|
||||
{
|
||||
|
||||
app.UseDeveloperExceptionPage();
|
||||
app.UseSwagger();
|
||||
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Serwer.Api v1"));
|
||||
//app.UseSwagger();
|
||||
//app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Serwer.Api v1"));
|
||||
}
|
||||
|
||||
app.UseHttpsRedirection();
|
||||
|
||||
app.UseRouting();
|
||||
|
||||
app.UseMiddleware(typeof(ExceptionHandlerMiddleware));
|
||||
|
||||
app.UseAuthentication();
|
||||
app.UseAuthorization();
|
||||
|
||||
|
BIN
Serwer/Serwer.Api/wwwroot/sample/wielomian.png
Normal file
BIN
Serwer/Serwer.Api/wwwroot/sample/wielomian.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 932 B |
BIN
Serwer/Serwer.Api/wwwroot/tessdata/eng.traineddata
Normal file
BIN
Serwer/Serwer.Api/wwwroot/tessdata/eng.traineddata
Normal file
Binary file not shown.
BIN
Serwer/Serwer.Api/wwwroot/tessdata/equ.traineddata
Normal file
BIN
Serwer/Serwer.Api/wwwroot/tessdata/equ.traineddata
Normal file
Binary file not shown.
BIN
Serwer/Serwer.Api/wwwroot/tessdata/pol.traineddata
Normal file
BIN
Serwer/Serwer.Api/wwwroot/tessdata/pol.traineddata
Normal file
Binary file not shown.
32
Serwer/Serwer.Core/Domain/File.cs
Normal file
32
Serwer/Serwer.Core/Domain/File.cs
Normal file
@ -0,0 +1,32 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Core.Domain
|
||||
{
|
||||
public class File
|
||||
{
|
||||
public string Name { get; protected set; }
|
||||
public string ContentType { get; protected set; }
|
||||
public byte[] Bytes { get; protected set; }
|
||||
public long SizeBytes => Bytes.Length;
|
||||
|
||||
protected File()
|
||||
{
|
||||
}
|
||||
|
||||
protected File(string name, string contentType, byte[] bytes)
|
||||
{
|
||||
Name = name;
|
||||
ContentType = contentType;
|
||||
Bytes = bytes;
|
||||
}
|
||||
|
||||
public static File Empty => new File();
|
||||
|
||||
public static File Create(string name, string contentType, byte[] bytes)
|
||||
=> new File(name, contentType, bytes);
|
||||
}
|
||||
}
|
13
Serwer/Serwer.Core/Domain/SearchResult.cs
Normal file
13
Serwer/Serwer.Core/Domain/SearchResult.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Core.Domain
|
||||
{
|
||||
public class SearchResult
|
||||
{
|
||||
|
||||
}
|
||||
}
|
@ -18,21 +18,22 @@ namespace Serwer.Core.Domain
|
||||
public DateTime UpdatedAt { get; protected set; }
|
||||
|
||||
protected User() { }
|
||||
public User(string email, string name, string surname, string login, string password)
|
||||
public User(Guid id, string email, string name, string surname, string login, string password)
|
||||
{
|
||||
Id = Guid.NewGuid();
|
||||
Id = id;
|
||||
SetEmail(email);
|
||||
SetName(name);
|
||||
SetSurname(surname);
|
||||
SetLogin(login);
|
||||
SetPassword(password);
|
||||
CreatedAt = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
public void SetEmail(string email)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(email))
|
||||
{
|
||||
throw new Exception("Email cannot be empty");
|
||||
throw new Exception("Email nie może być pusty.");
|
||||
}
|
||||
if (Email == email)
|
||||
{
|
||||
@ -47,7 +48,7 @@ namespace Serwer.Core.Domain
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(name))
|
||||
{
|
||||
throw new Exception("Name cannot be empty");
|
||||
throw new Exception("Imię nie może być puste.");
|
||||
}
|
||||
if (Name == name)
|
||||
{
|
||||
@ -62,7 +63,7 @@ namespace Serwer.Core.Domain
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(surname))
|
||||
{
|
||||
throw new Exception("Surname cannot be empty");
|
||||
throw new Exception("Nazwisko nie może być puste.");
|
||||
}
|
||||
if (Surname == surname)
|
||||
{
|
||||
@ -77,7 +78,7 @@ namespace Serwer.Core.Domain
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(login))
|
||||
{
|
||||
throw new Exception("Login cannot be empty");
|
||||
throw new Exception("Login nie może być pusty.");
|
||||
}
|
||||
if (Login == login)
|
||||
{
|
||||
@ -92,7 +93,7 @@ namespace Serwer.Core.Domain
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(password))
|
||||
{
|
||||
throw new Exception("Password cannot be empty");
|
||||
throw new Exception("Hasło nie może być puste.");
|
||||
}
|
||||
if (Password == password)
|
||||
{
|
||||
|
32
Serwer/Serwer.Core/Domain/UserHistory.cs
Normal file
32
Serwer/Serwer.Core/Domain/UserHistory.cs
Normal file
@ -0,0 +1,32 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Core.Domain
|
||||
{
|
||||
public class UserHistory
|
||||
{
|
||||
private readonly ISet<string> _history;
|
||||
public User User { get; protected set; }
|
||||
public List<string> History
|
||||
{
|
||||
get
|
||||
{
|
||||
return _history.Select(x => x).ToList();
|
||||
}
|
||||
}
|
||||
|
||||
public UserHistory(User user)
|
||||
{
|
||||
User = user;
|
||||
_history = new HashSet<string>();
|
||||
}
|
||||
|
||||
public void Add(string query)
|
||||
{
|
||||
_history.Add(query);
|
||||
}
|
||||
}
|
||||
}
|
15
Serwer/Serwer.Core/Repositories/IHistoryRepository.cs
Normal file
15
Serwer/Serwer.Core/Repositories/IHistoryRepository.cs
Normal file
@ -0,0 +1,15 @@
|
||||
using Serwer.Core.Domain;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Core.Repositories
|
||||
{
|
||||
public interface IHistoryRepository
|
||||
{
|
||||
Task AddAsync(User user, string query);
|
||||
Task<UserHistory> GetAsync(User user);
|
||||
}
|
||||
}
|
15
Serwer/Serwer.Infrastructure/DTO/SearchResultDto.cs
Normal file
15
Serwer/Serwer.Infrastructure/DTO/SearchResultDto.cs
Normal file
@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Infrastructure.DTO
|
||||
{
|
||||
public class SearchResultDTO
|
||||
{
|
||||
public string Title { get; set; }
|
||||
public string Link { get; set; }
|
||||
public string Snippet { get; set; }
|
||||
}
|
||||
}
|
@ -8,6 +8,7 @@ namespace Serwer.Infrastructure.DTO
|
||||
{
|
||||
public class UserDto
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string Email { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Surname { get; set; }
|
||||
|
14
Serwer/Serwer.Infrastructure/DTO/UserHistoryDto.cs
Normal file
14
Serwer/Serwer.Infrastructure/DTO/UserHistoryDto.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Infrastructure.DTO
|
||||
{
|
||||
public class UserHistoryDto
|
||||
{
|
||||
public List<string> History { get; set; }
|
||||
public UserDto User { get; set; }
|
||||
}
|
||||
}
|
74
Serwer/Serwer.Infrastructure/Framework/OCRResponseData.cs
Normal file
74
Serwer/Serwer.Infrastructure/Framework/OCRResponseData.cs
Normal file
@ -0,0 +1,74 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Infrastructure.Framework
|
||||
{
|
||||
public class OCRResponseData
|
||||
{
|
||||
/// <summary>
|
||||
/// Error message
|
||||
/// </summary>
|
||||
public string ErrorMessage { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Available pages
|
||||
/// </summary>
|
||||
public int AvailablePages { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// OCRed text
|
||||
/// </summary>
|
||||
public List<List<string>> OCRText { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Output file1 URL
|
||||
/// </summary>
|
||||
public string OutputFileUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Output file2 URL
|
||||
/// </summary>
|
||||
public string OutputFileUrl2 { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Output file3 URL
|
||||
/// </summary>
|
||||
public string OutputFileUrl3 { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reserved
|
||||
/// </summary>
|
||||
public List<List<string>> Reserved { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// OCRWords
|
||||
/// </summary>
|
||||
public List<List<OCRWSWord>> OCRWords { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Task description
|
||||
/// </summary>
|
||||
public string TaskDescription { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Constructor
|
||||
/// </summary>
|
||||
public OCRResponseData()
|
||||
{
|
||||
OCRText = new List<List<string>>();
|
||||
Reserved = new List<List<string>>();
|
||||
OCRWords = new List<List<OCRWSWord>>();
|
||||
}
|
||||
}
|
||||
public class OCRWSWord
|
||||
{
|
||||
public int Top;
|
||||
public int Left;
|
||||
public int Height;
|
||||
public int Width;
|
||||
public string OCRWord;
|
||||
}
|
||||
}
|
@ -15,6 +15,7 @@ namespace Serwer.Infrastructure.Mappers
|
||||
=> new MapperConfiguration(cfg =>
|
||||
{
|
||||
cfg.CreateMap<User, UserDto>();
|
||||
cfg.CreateMap<UserHistory, UserHistoryDto>();
|
||||
})
|
||||
.CreateMapper();
|
||||
}
|
||||
|
@ -0,0 +1,31 @@
|
||||
using Serwer.Core.Domain;
|
||||
using Serwer.Core.Repositories;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Infrastructure.Repositories
|
||||
{
|
||||
public class HistoryRepository: IHistoryRepository
|
||||
{
|
||||
private static ISet<UserHistory> _history = new HashSet<UserHistory>();
|
||||
|
||||
public async Task AddAsync(User user, string query)
|
||||
{
|
||||
var history = _history.FirstOrDefault(x => x.User.Id == user.Id);
|
||||
if(history == null)
|
||||
{
|
||||
history = new UserHistory(user);
|
||||
}
|
||||
history.Add(query);
|
||||
await Task.FromResult(_history.Add(history));
|
||||
}
|
||||
|
||||
public async Task<UserHistory> GetAsync(User user)
|
||||
{
|
||||
var history = _history.FirstOrDefault(x => x.User.Id == user.Id);
|
||||
return await Task.FromResult(history);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
36
Serwer/Serwer.Infrastructure/Services/HistoryService.cs
Normal file
36
Serwer/Serwer.Infrastructure/Services/HistoryService.cs
Normal file
@ -0,0 +1,36 @@
|
||||
using AutoMapper;
|
||||
using Serwer.Core.Domain;
|
||||
using Serwer.Core.Repositories;
|
||||
using Serwer.Infrastructure.DTO;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Infrastructure.Services
|
||||
{
|
||||
public class HistoryService: IHistoryService
|
||||
{
|
||||
private readonly IHistoryRepository _historyRepository;
|
||||
private readonly IUserRepository _userRepository;
|
||||
private readonly IMapper _mapper;
|
||||
public HistoryService(IHistoryRepository historyRepository, IUserRepository userRepository, IMapper mapper)
|
||||
{
|
||||
_historyRepository = historyRepository;
|
||||
_userRepository = userRepository;
|
||||
_mapper = mapper;
|
||||
}
|
||||
|
||||
public async Task<UserHistoryDto> GetAsync(Guid userId)
|
||||
{
|
||||
var user = await _userRepository.GetAsync(userId);
|
||||
if(user == null)
|
||||
{
|
||||
throw new Exception("Coś poszło nie tak.");
|
||||
}
|
||||
var history = await _historyRepository.GetAsync(user);
|
||||
return _mapper.Map<UserHistoryDto>(history);
|
||||
}
|
||||
}
|
||||
}
|
15
Serwer/Serwer.Infrastructure/Services/IHistoryService.cs
Normal file
15
Serwer/Serwer.Infrastructure/Services/IHistoryService.cs
Normal file
@ -0,0 +1,15 @@
|
||||
using Serwer.Core.Domain;
|
||||
using Serwer.Infrastructure.DTO;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Infrastructure.Services
|
||||
{
|
||||
public interface IHistoryService
|
||||
{
|
||||
Task<UserHistoryDto> GetAsync(Guid userId);
|
||||
}
|
||||
}
|
14
Serwer/Serwer.Infrastructure/Services/IImageHandler.cs
Normal file
14
Serwer/Serwer.Infrastructure/Services/IImageHandler.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using Serwer.Core.Domain;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Infrastructure.Services
|
||||
{
|
||||
public interface IImageHandler
|
||||
{
|
||||
Task<string> Process(string name, string contentType, byte[] bytes);
|
||||
}
|
||||
}
|
13
Serwer/Serwer.Infrastructure/Services/ISearchService.cs
Normal file
13
Serwer/Serwer.Infrastructure/Services/ISearchService.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Serwer.Infrastructure.DTO;
|
||||
namespace Serwer.Infrastructure.Services
|
||||
{
|
||||
public interface ISearchService
|
||||
{
|
||||
Task<IList<SearchResultDTO>> Search(Guid userId, string query);
|
||||
}
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
using Serwer.Infrastructure.DTO;
|
||||
using Serwer.Infrastructure.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@ -11,5 +12,6 @@ namespace Serwer.Infrastructure.Services
|
||||
{
|
||||
Task RegisterAsync(string email, string name, string surname, string login, string password);
|
||||
Task<SignedUserDto> SignInAsync(string login, string password);
|
||||
Task<UserDto> UpdateAsync(UpdateUserModel userModel);
|
||||
}
|
||||
}
|
||||
|
85
Serwer/Serwer.Infrastructure/Services/ImageHandler.cs
Normal file
85
Serwer/Serwer.Infrastructure/Services/ImageHandler.cs
Normal file
@ -0,0 +1,85 @@
|
||||
using Newtonsoft.Json;
|
||||
using Serwer.Core.Domain;
|
||||
using Serwer.Infrastructure.Framework;
|
||||
using Serwer.Infrastructure.Settings;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Tesseract;
|
||||
|
||||
namespace Serwer.Infrastructure.Services
|
||||
{
|
||||
public class ImageHandler : IImageHandler
|
||||
{
|
||||
private readonly ISet<File> _files = new HashSet<File>();
|
||||
private readonly string _env;
|
||||
public ImageHandler(IHostEnviroment hostEnviroment)
|
||||
{
|
||||
_env = hostEnviroment.RootPath;
|
||||
}
|
||||
public async Task<string> Process(string name, string contentType, byte[] bytes)
|
||||
{
|
||||
string license_code = "FC935C59-F248-48A3-9970-8A6BDB66FA86";
|
||||
string user_name = "poszukiwacz";
|
||||
|
||||
string ocrURL = @"http://www.ocrwebservice.com/restservices/processDocument?gettext=true&outputformat=txt&language=polish";
|
||||
byte[] uploadData = bytes;
|
||||
|
||||
HttpWebRequest request = CreateHttpRequest(ocrURL, user_name, license_code, "POST");
|
||||
request.ContentLength = uploadData.Length;
|
||||
|
||||
// Send request
|
||||
using (System.IO.Stream post = request.GetRequestStream())
|
||||
{
|
||||
post.Write(uploadData, 0, (int)uploadData.Length);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// Get response
|
||||
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
|
||||
{
|
||||
// Parse JSON response
|
||||
string strJSON = new System.IO.StreamReader(response.GetResponseStream()).ReadToEnd();
|
||||
OCRResponseData ocrResponse = JsonConvert.DeserializeObject<OCRResponseData>(strJSON);
|
||||
|
||||
return await Task.FromResult(ocrResponse.OCRText.First().First());
|
||||
|
||||
}
|
||||
}
|
||||
catch (WebException wex)
|
||||
{
|
||||
var x = string.Format("OCR API Error. HTTPCode:{0}", ((HttpWebResponse)wex.Response).StatusCode);
|
||||
throw wex;
|
||||
}
|
||||
/*
|
||||
var engine = new TesseractEngine(System.IO.Path.Combine(_env, "tessdata"),"eng+equ", EngineMode.Default);
|
||||
var img = Pix.LoadFromMemory(bytes);
|
||||
var res = engine.Process(img);
|
||||
var txt = res.GetText();
|
||||
|
||||
return await Task.FromResult(txt);
|
||||
*/
|
||||
|
||||
}
|
||||
private static HttpWebRequest CreateHttpRequest(string address_url, string user_name, string license_code, string http_method)
|
||||
{
|
||||
Uri address = new Uri(address_url);
|
||||
|
||||
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address);
|
||||
|
||||
byte[] authBytes = Encoding.UTF8.GetBytes(string.Format("{0}:{1}", user_name, license_code).ToCharArray());
|
||||
request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(authBytes);
|
||||
request.Method = http_method;
|
||||
request.Timeout = 600000;
|
||||
|
||||
// Specify Response format to JSON or XML (application/json or application/xml)
|
||||
request.ContentType = "application/json";
|
||||
|
||||
return request;
|
||||
}
|
||||
}
|
||||
}
|
89
Serwer/Serwer.Infrastructure/Services/SearchService.cs
Normal file
89
Serwer/Serwer.Infrastructure/Services/SearchService.cs
Normal file
@ -0,0 +1,89 @@
|
||||
using Google.Apis.Customsearch.v1;
|
||||
using Google.Apis.Services;
|
||||
using Newtonsoft.Json;
|
||||
using Serwer.Core.Repositories;
|
||||
using Serwer.Infrastructure.DTO;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Threading.Tasks;
|
||||
namespace Serwer.Infrastructure.Services
|
||||
{
|
||||
public class SearchService : ISearchService
|
||||
{
|
||||
private readonly IImageHandler _imageHandler;
|
||||
private readonly IHistoryRepository _historyRepository;
|
||||
private readonly IUserRepository _userRepository;
|
||||
private const string apiKey = "AIzaSyCagG6QyQyBuJNb1YDuK25qSzoC0Rrjo0c";
|
||||
private const string searchEngineId = "17b946686537c46e3";
|
||||
public SearchService(IImageHandler imageHandler, IHistoryRepository historyRepository, IUserRepository userRepository)
|
||||
{
|
||||
_imageHandler = imageHandler;
|
||||
_historyRepository = historyRepository;
|
||||
_userRepository = userRepository;
|
||||
}
|
||||
public async Task<IList<SearchResultDTO>> Search(Guid userId, string query)
|
||||
{
|
||||
var user = await _userRepository.GetAsync(userId);
|
||||
if(user == null)
|
||||
{
|
||||
throw new Exception("Coś poszło nie tak.");
|
||||
}
|
||||
await _historyRepository.AddAsync(user, query);
|
||||
|
||||
var queries = query.Split('.').ToList();
|
||||
if (queries.Count > 2)
|
||||
{
|
||||
var q0 = queries[0].Split(' ');
|
||||
if (q0.Length < 3)
|
||||
{
|
||||
queries.RemoveAt(0);
|
||||
}
|
||||
if(queries.Last().Length < 5)
|
||||
{
|
||||
queries.RemoveAt(queries.Count - 1);
|
||||
}
|
||||
}
|
||||
query = String.Join(".", queries);
|
||||
var result = await sendRequest(query);
|
||||
if(result.Count == 0)
|
||||
{
|
||||
result = await sendRequest(queries.Last());
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
private async Task<List<SearchResultDTO>> sendRequest(string query)
|
||||
{
|
||||
WebRequest webRequest = WebRequest.Create($"https://www.googleapis.com/customsearch/v1?key={apiKey}&cx={searchEngineId}&q={query}");
|
||||
using (var stream = new StreamReader(webRequest.GetResponse().GetResponseStream()))
|
||||
{
|
||||
var response = await stream.ReadToEndAsync();
|
||||
dynamic jsonData = JsonConvert.DeserializeObject(response);
|
||||
|
||||
var results = new List<SearchResultDTO>();
|
||||
try
|
||||
{
|
||||
foreach (var item in jsonData.items)
|
||||
{
|
||||
results.Add(new SearchResultDTO
|
||||
{
|
||||
Title = item.title,
|
||||
Link = item.link,
|
||||
Snippet = item.snippet
|
||||
});
|
||||
}
|
||||
return results;
|
||||
}
|
||||
catch(Exception)
|
||||
{
|
||||
return results;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -3,6 +3,7 @@ using Serwer.Core.Domain;
|
||||
using Serwer.Core.Repositories;
|
||||
using Serwer.Infrastructure.DTO;
|
||||
using Serwer.Infrastructure.Mappers;
|
||||
using Serwer.Infrastructure.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
@ -28,9 +29,9 @@ namespace Serwer.Infrastructure.Services
|
||||
{
|
||||
if(await _userRepository.GetAsync(login) != null)
|
||||
{
|
||||
throw new Exception($"User with login: {login} already exists.");
|
||||
throw new Exception($"Użytkownik z loginem: {login} już istnieje.");
|
||||
}
|
||||
var user = new User(email, name, surname, login, password);
|
||||
var user = new User(Guid.NewGuid(), email, name, surname, login, password);
|
||||
await _userRepository.AddAsync(user);
|
||||
}
|
||||
|
||||
@ -39,11 +40,11 @@ namespace Serwer.Infrastructure.Services
|
||||
var user = await _userRepository.GetAsync(login);
|
||||
if(user == null)
|
||||
{
|
||||
throw new Exception("User not found.");
|
||||
throw new Exception("Nie znaleziono użytkownika.");
|
||||
}
|
||||
if(user.Password != password)
|
||||
{
|
||||
throw new Exception("Incorrect password.");
|
||||
throw new Exception("Hasło niepoprawne.");
|
||||
}
|
||||
|
||||
var jwt = _jwtHandler.CreateToken(user.Id);
|
||||
@ -54,5 +55,24 @@ namespace Serwer.Infrastructure.Services
|
||||
Jwt = _mapper.Map<JwtDto>(jwt)
|
||||
};
|
||||
}
|
||||
|
||||
public async Task<UserDto> UpdateAsync(UpdateUserModel userModel)
|
||||
{
|
||||
var user = await _userRepository.GetAsync(userModel.Id);
|
||||
if(user == null)
|
||||
{
|
||||
throw new Exception("Nie znaleziono użytkownika.");
|
||||
}
|
||||
var userLoginTaken = await _userRepository.GetAsync(userModel.Login);
|
||||
if(userLoginTaken != null && userLoginTaken.Id != user.Id)
|
||||
{
|
||||
throw new Exception("Login jest już zajęty.");
|
||||
}
|
||||
|
||||
var newUser = new User(user.Id, userModel.Email, userModel.Name, userModel.Surname, userModel.Login, user.Password);
|
||||
await _userRepository.UpdateAsync(newUser);
|
||||
newUser = await _userRepository.GetAsync(user.Id);
|
||||
return _mapper.Map<UserDto>(newUser);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6,12 +6,31 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="AutoMapper" Version="10.1.1" />
|
||||
<PackageReference Include="Google.Apis.Customsearch.v1" Version="1.49.0.2084" />
|
||||
<PackageReference Include="Google.Apis.CustomSearchAPI.v1" Version="1.49.0.2172" />
|
||||
<PackageReference Include="Microsoft.IdentityModel.Tokens" Version="6.8.0" />
|
||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.8.0" />
|
||||
<PackageReference Include="Tesseract" Version="4.1.1" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Serwer.Core\Serwer.Core.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="C:\Users\ppopo\.nuget\packages\tesseract\4.1.1\build\\..\x64\leptonica-1.80.0.dll" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="C:\Users\ppopo\.nuget\packages\tesseract\4.1.1\build\\..\x64\tesseract41.dll" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="C:\Users\ppopo\.nuget\packages\tesseract\4.1.1\build\\..\x86\leptonica-1.80.0.dll" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="C:\Users\ppopo\.nuget\packages\tesseract\4.1.1\build\\..\x86\tesseract41.dll" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
13
Serwer/Serwer.Infrastructure/Settings/HostEnviroment.cs
Normal file
13
Serwer/Serwer.Infrastructure/Settings/HostEnviroment.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Infrastructure.Settings
|
||||
{
|
||||
public class HostEnviroment: IHostEnviroment
|
||||
{
|
||||
public string RootPath { get; set; }
|
||||
}
|
||||
}
|
13
Serwer/Serwer.Infrastructure/Settings/IHostEnviroment.cs
Normal file
13
Serwer/Serwer.Infrastructure/Settings/IHostEnviroment.cs
Normal file
@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Infrastructure.Settings
|
||||
{
|
||||
public interface IHostEnviroment
|
||||
{
|
||||
string RootPath { get; set; }
|
||||
}
|
||||
}
|
17
Serwer/Serwer.Infrastructure/ViewModels/RegisterModel.cs
Normal file
17
Serwer/Serwer.Infrastructure/ViewModels/RegisterModel.cs
Normal file
@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Infrastructure.ViewModels
|
||||
{
|
||||
public class RegisterModel
|
||||
{
|
||||
public string Email { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Surname { get; set; }
|
||||
public string Login { get; set; }
|
||||
public string Password { get; set; }
|
||||
}
|
||||
}
|
14
Serwer/Serwer.Infrastructure/ViewModels/SignInModel.cs
Normal file
14
Serwer/Serwer.Infrastructure/ViewModels/SignInModel.cs
Normal file
@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Infrastructure.ViewModels
|
||||
{
|
||||
public class SignInModel
|
||||
{
|
||||
public string Login { get; set; }
|
||||
public string Password { get; set; }
|
||||
}
|
||||
}
|
17
Serwer/Serwer.Infrastructure/ViewModels/UpdateUserModel.cs
Normal file
17
Serwer/Serwer.Infrastructure/ViewModels/UpdateUserModel.cs
Normal file
@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serwer.Infrastructure.ViewModels
|
||||
{
|
||||
public class UpdateUserModel
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string Email { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Surname { get; set; }
|
||||
public string Login { get; set; }
|
||||
}
|
||||
}
|
@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.30717.126
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Serwer.Tests", "Serwer.Tests\Serwer.Tests.csproj", "{4169F6FD-E08D-4329-BF87-A1411A9F1EF4}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Serwer.Core", "Serwer.Core\Serwer.Core.csproj", "{115E0BB1-FCC1-4E45-92B0-D3B6B4A3DA82}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Serwer.Infrastructure", "Serwer.Infrastructure\Serwer.Infrastructure.csproj", "{523E9EE6-B8D9-4E08-A9A0-50D7F872C79C}"
|
||||
@ -24,10 +22,6 @@ Global
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{4169F6FD-E08D-4329-BF87-A1411A9F1EF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{4169F6FD-E08D-4329-BF87-A1411A9F1EF4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{4169F6FD-E08D-4329-BF87-A1411A9F1EF4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{4169F6FD-E08D-4329-BF87-A1411A9F1EF4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{115E0BB1-FCC1-4E45-92B0-D3B6B4A3DA82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{115E0BB1-FCC1-4E45-92B0-D3B6B4A3DA82}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{115E0BB1-FCC1-4E45-92B0-D3B6B4A3DA82}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
|
Loading…
Reference in New Issue
Block a user