Compare commits

...

71 Commits

Author SHA1 Message Date
5b1657e4f6 Serwer 2021-01-30 19:36:06 +01:00
74df2904b2 Merge pull request 'develop' (#10) from develop into master
Reviewed-on: #10
2021-01-27 18:32:18 +01:00
4b41abf79d Merge pull request 'POS_Sprint_7' (#9) from POS_Sprint_7 into develop
Reviewed-on: #9
2021-01-27 18:31:46 +01:00
4ccce95280 Merge pull request 'POS_Sprint_6' (#8) from POS_Sprint_6 into develop
Reviewed-on: #8
2021-01-27 18:31:08 +01:00
d103e4146d POS-49 Naprawa literówek, możliwość wylogowania 2021-01-25 14:21:21 +01:00
s426226
1941a77a91 POS-50 poprawienie bledow 2021-01-25 11:54:39 +01:00
s426226
41c703bb6d hot-fix 2021-01-18 13:20:12 +01:00
8b51fa1310 Konflikt 2021-01-18 00:05:37 +01:00
327262473d POS-45 Ekran startowy is back babyyy 2021-01-17 23:51:35 +01:00
8ce472a931 POS-45 Dodanie możliwości robienia zdjęć 2021-01-17 23:50:57 +01:00
s426226
f2f98bb92d Merge branch 'POS_Sprint_6' of https://git.wmi.amu.edu.pl/s426229/Poszukiwacz into POS_Sprint_6 2021-01-16 18:50:51 +01:00
s426226
e815313439 POS-46 2021-01-16 18:45:20 +01:00
s426226
dd6a16df54 Fix history 2021-01-16 13:59:11 +01:00
966edab483 POS-48 Dodano wyświetlanie błędów w ekranie historii i materiałach 2021-01-15 17:18:31 +01:00
925b79e1ca POS-47 Dodano scroll do ekranów historii i z materiałami 2021-01-15 15:45:32 +01:00
f0e62f261e POS-47 ekran startowy jest znowu ekranem startowym 2021-01-14 23:02:32 +01:00
15e4ebbaa0 POS-47 Zamiana wyglądu gudzika cofania. 2021-01-14 22:16:17 +01:00
8c97d210bc Merge pull request 'POS_Sprint_5' (#7) from POS_Sprint_5 into develop
Reviewed-on: #7
2021-01-14 20:00:41 +01:00
46b97ec42f PSO-40 fixx 2021-01-11 14:16:51 +01:00
42be667958 POS-40 Fix error msg 2021-01-11 14:15:14 +01:00
2d5e43a42b POS-40 Dokończono erkan z linkami 2021-01-11 14:05:50 +01:00
fc00e94f6a POS-40 Początek ekranu z linkami 2021-01-11 01:59:23 +01:00
b3732fc11d POS-41 dodanie zgubionego } 2021-01-11 01:12:39 +01:00
ded54aeabd POS-41 Dodano ekran historii oraz jej wyświetlanie 2021-01-11 01:08:58 +01:00
f44eef3079 POS-39 Przerwy w pomocy w rejestracji 2021-01-10 00:45:39 +01:00
d8ca055c90 POS-39 Dodanie ekranu pomocy na erkanie ładowania zdjęć 2021-01-10 00:44:01 +01:00
d16fb48c15 POS-39 Dodanie ekranu pomocy rejestracji 2021-01-10 00:34:27 +01:00
8581e26ac5 Fix 2021-01-09 19:42:42 +01:00
37339bbb6a POS-44 Poprawiono wyświetlanie błędów 2021-01-09 19:40:33 +01:00
d2fe3e384c POS-39 Dodanie ekranu informacji do głównego ekranu. 2021-01-09 19:38:56 +01:00
2e5b7422cf POS-44 Poprawiono wyświetlanie błędów 2021-01-09 19:38:55 +01:00
364da365e7 Merge branch 'POS_Sprint_4' of https://git.wmi.amu.edu.pl/s426229/Poszukiwacz into POS_Sprint_4 2021-01-09 19:37:27 +01:00
353c7283cf POS-39 Dodanie ekranu informacji do głównego ekranu. 2021-01-09 19:36:44 +01:00
a6679995b6 POS-44 Poprawiono wyświetlanie błędów 2021-01-09 19:36:44 +01:00
08c27b3c3a Merge pull request 'POS_Sprint_4' (#6) from POS_Sprint_4 into develop
Reviewed-on: #6
2021-01-09 19:34:16 +01:00
6126c2d929 POS-39 Dodanie ekranu informacji do głównego ekranu. 2021-01-09 19:27:00 +01:00
5b909f6d1a POS-44 Poprawiono wyświetlanie błędów 2021-01-09 18:15:51 +01:00
s426226
a41b7d3829 POS-42 2021-01-09 14:44:14 +01:00
s426226
c9de5656c3 POS-43 2021-01-09 11:55:07 +01:00
6586dc6170 POS-30 Dodano obsługę błędów - klient 2021-01-02 20:21:03 +01:00
s426226
da4287973e POS-38 zintegrowanie autoryzacji oraz danych przesylanych przez serwer 2020-12-31 16:20:38 +01:00
s426226
d9b9b19e7d POS-28 dodanie powrotu do ekranu startowego i po logowaniu 2020-12-31 14:38:35 +01:00
c322233ae8 POS-36 Wprowadzono zmiany do wyglądu ekranu profilu. 2020-12-31 00:16:29 +01:00
70afc48290 POS-37 Naprawiono podpowiedzi w formularzu rejstracji 2020-12-30 23:36:42 +01:00
3128f9ef5d Merge pull request 'POS_Sprint_3' (#5) from POS_Sprint_3 into develop
Sprint 3 zakończył się zrobieniem wszystkich zadań.
2020-12-30 17:30:23 +01:00
dbc629f942 POS-32 Poprawiony błąd 2020-12-21 16:29:10 +01:00
10cf3ca9c0 POS-32 Poprwka 2020-12-21 16:26:48 +01:00
2ea2a4293f POS-32 Dodano ekran edycji profilu 2020-12-21 16:19:54 +01:00
a83d141ac2 POS-32 Dodano ekran personalizacji projektu 2020-12-21 15:29:38 +01:00
48a742651a POS-31 Poprawa czytelności kodu 2020-12-21 14:12:01 +01:00
50e664ae5a POS-31 Możliwość wyświetlenia hasła 2020-12-21 13:55:27 +01:00
s426226
362cfdcee0 POS-34 dodanie wyszukiwania przez google api 2020-12-20 18:03:20 +01:00
s426226
cfb0800065 POS-35 2020-12-18 16:06:10 +01:00
s426226
04ad1f02f4 POS-33 2020-12-18 16:04:07 +01:00
s426226
11f96f9d06 POS-29 2020-12-16 16:26:13 +01:00
3e8eed3e25 Merge pull request 'POS_Sprint_2' (#4) from POS_Sprint_2 into develop
Brak Konfliktów, zakończenie 2 sprintu, wszystkie zadania zakończone.
2020-12-14 19:27:09 +01:00
s426226
c2c1cfe943 POS-27 2020-12-14 11:04:07 +01:00
7687c54609 POS-21 Dodano możliwość wysyłania zdjęcia do serwera. 2020-12-14 00:17:38 +01:00
s426226
b9f6739a55 Merge branch 'POS_Sprint_2' of https://git.wmi.amu.edu.pl/s426229/Poszukiwacz into POS_Sprint_2 2020-12-13 19:39:09 +01:00
s426226
e4114ae7e6 POS-26 naprawa emulatora klienta 2020-12-13 19:38:01 +01:00
827b522c65 POS-22 Stworzono możliwość dodawania zdjęcia z galerii. 2020-12-13 18:58:31 +01:00
b1b934ca9b POS-22 Dodanie praw do manifestu. 2020-12-13 17:39:54 +01:00
s426226
83665f0919 POS-25 Dodanie ViewModels 2020-12-12 20:54:08 +01:00
s426226
dd74f059da POS-24 Dodanie prostego rozpoznawania tekstu 2020-12-12 18:11:56 +01:00
s426226
4447d72032 POS-23 Dodanie obslugi zdjec 2020-12-12 14:18:31 +01:00
8e3c9635c3 POS-22 Dodanie ekranu z podglądem zdjęcia prze wysłaniem 2020-12-10 20:37:35 +01:00
44b7f9e1a7 POS-20 Dodano widok ekranu dostępnego po zalogowaniu, dający możliwość wysłania zdjęcia z pliku lub z aparatu. 2020-12-10 02:16:22 +01:00
a6d1d028f3 POS-19 Dodano pierwszy wygląd strony startowej, oraz przejścia do podstron. 2020-12-10 01:07:29 +01:00
1dda5c1770 Merge pull request 'POS_Sprint_1' (#3) from POS_Sprint_1 into develop
Sprint 1 zakończony wykonaniem wszystkich zadań.
2020-12-07 19:40:59 +01:00
69dc67eb28 Merge pull request 'POS_Sprint_1' (#2) from POS_Sprint_1 into develop
Start 2
2020-12-03 19:54:13 +01:00
b7a4361a00 Merge pull request 'POS_Sprint_1' (#1) from POS_Sprint_1 into master
Start
2020-12-03 19:53:03 +01:00
68 changed files with 3285 additions and 945 deletions

View File

@ -13,57 +13,103 @@ using System.Security;
using System.Net; using System.Net;
using System.Linq; 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 namespace Klient.Droid
{ {
[Activity(Label = "Klient", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] [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 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(); 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) protected override void OnCreate(Bundle savedInstanceState)
{ {
base.OnCreate(savedInstanceState); base.OnCreate(savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.SetVmPolicy(builder.Build());
LoadApplication(new App()); LoadApplication(new App());
SetContentView(Resource.Layout.ekranLogowania); SetContentView(Resource.Layout.ekranStartowy);
} }
[Java.Interop.Export("SignIn")] [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; var Login = FindViewById<EditText>(Resource.Id.Login).Text;
SecureString Password = new NetworkCredential("", FindViewById<EditText>(Resource.Id.Password).Text).SecurePassword; 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")] [Java.Interop.Export("HelpLoginScreen")]
async public void ResetPassword() public void GoToAboutScreen(View v)
{ {
SetContentView(Resource.Layout.ekranInformacji);
} }
[Java.Interop.Export("SignUp")] [Java.Interop.Export("SignUp")]
async public void SignUp() async public void SignUp(View v)
{ {
var Name = FindViewById<EditText>(Resource.Id.Name).Text; var Name = FindViewById<EditText>(Resource.Id.Name).Text;
var Surname = FindViewById<EditText>(Resource.Id.Surname).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 Password = new NetworkCredential("", FindViewById<EditText>(Resource.Id.NewPassword).Text).SecurePassword;
SecureString Password2 = new NetworkCredential("", FindViewById<EditText>(Resource.Id.RepeatPassword).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 }, FindViewById<TextView>(Resource.Id.ErrorRegister).Text = "Hasła muszą być identyczne!";
{ "name", Name }, FindViewById<EditText>(Resource.Id.NewPassword).Text = "";
{ "surname", Surname }, FindViewById<EditText>(Resource.Id.RepeatPassword).Text = "";
{ "login", Login }, }
{ "password", new NetworkCredential("", Password).Password } 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) public void HelpLoginScreen(View v)
{ {
SetContentView(Resource.Layout.ekranRejestracji); 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);
}
} }
} }

View 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; }
}
}

View File

@ -35,6 +35,8 @@
<AndroidEnableProfiledAot>false</AndroidEnableProfiledAot> <AndroidEnableProfiledAot>false</AndroidEnableProfiledAot>
<BundleAssemblies>false</BundleAssemblies> <BundleAssemblies>false</BundleAssemblies>
<MandroidI18n /> <MandroidI18n />
<Debugger>Xamarin</Debugger>
<AndroidSupportedAbis />
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
@ -47,6 +49,7 @@
<AndroidUseSharedRuntime>false</AndroidUseSharedRuntime> <AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Microsoft.CSharp" />
<Reference Include="Mono.Android" /> <Reference Include="Mono.Android" />
<Reference Include="Mono.Android.Export" /> <Reference Include="Mono.Android.Export" />
<Reference Include="System" /> <Reference Include="System" />
@ -56,6 +59,9 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Newtonsoft.Json">
<Version>12.0.3</Version>
</PackageReference>
<PackageReference Include="Xamarin.Essentials"> <PackageReference Include="Xamarin.Essentials">
<Version>1.5.3.2</Version> <Version>1.5.3.2</Version>
</PackageReference> </PackageReference>
@ -68,6 +74,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="MainActivity.cs" /> <Compile Include="MainActivity.cs" />
<Compile Include="Modules\SearchResult.cs" />
<Compile Include="Resources\Resource.designer.cs" /> <Compile Include="Resources\Resource.designer.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
@ -93,12 +100,10 @@
<AndroidResource Include="Resources\mipmap-xxxhdpi\launcher_foreground.png" /> <AndroidResource Include="Resources\mipmap-xxxhdpi\launcher_foreground.png" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="Modules\" />
<Folder Include="Resources\drawable-hdpi\" /> <Folder Include="Resources\drawable-hdpi\" />
<Folder Include="Resources\drawable-xhdpi\" /> <Folder Include="Resources\drawable-xhdpi\" />
<Folder Include="Resources\drawable-xxhdpi\" /> <Folder Include="Resources\drawable-xxhdpi\" />
<Folder Include="Resources\drawable-xxxhdpi\" /> <Folder Include="Resources\drawable-xxxhdpi\" />
<Folder Include="Resources\drawable\" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Klient\Klient.csproj"> <ProjectReference Include="..\Klient\Klient.csproj">
@ -116,6 +121,69 @@
<SubType>Designer</SubType> <SubType>Designer</SubType>
</AndroidResource> </AndroidResource>
</ItemGroup> </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" /> <Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
<ProjectExtensions> <ProjectExtensions>
<VisualStudio> <VisualStudio>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?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"> <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="21" android:targetSdkVersion="28" /> <uses-sdk android:minSdkVersion="28" android:targetSdkVersion="27" />
<application android:label="Klient.Android"></application> <application android:label="Klient.Android" android:usesCleartextTraffic="true" android:theme="@style/Base.Theme.AppCompat.Light.DarkActionBar" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest> </manifest>

View File

@ -15,6 +15,7 @@ using Android.App;
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
[assembly: ComVisible(false)] [assembly: ComVisible(false)]
[assembly: Application(Theme = "@style/Base.Theme.AppCompat.Light.DarkActionBar")]
// Version information for an assembly consists of the following four values: // Version information for an assembly consists of the following four values:
// //

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 925 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 730 B

View File

@ -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>

View File

@ -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>

View File

@ -8,70 +8,79 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="#ffbdd7f0" android:background="#ffbdd7f0"
> >
<android.support.design.widget.TextInputLayout
<android.support.design.widget.TextInputEditText android:id="@+id/LayoutLogin"
android:layout_width="204.0dp" android:layout_width="wrap_content"
android:layout_height="58.0dp" android:layout_height="wrap_content"
android:id="@+id/Login"
android:layout_alignParentStart="false"
android:minWidth="25px"
android:minHeight="25px"
android:layout_centerInParent="false"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_alignParentTop="true" android:hint="Login">
android:hint="Login" <EditText
android:gravity="center_horizontal|center_vertical" android:layout_width="204.0dp"
android:textColor="#ff000000" android:layout_height="58.0dp"
android:textColorHint="#ff6c6767" /> 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.support.design.widget.TextInputLayout
android:layout_width="204.0dp" android:id="@+id/LayoutPassword"
android:layout_height="58.0dp" android:layout_width="wrap_content"
android:id="@+id/Password" android:layout_height="wrap_content"
app:passwordToggleEnabled="true"
android:layout_below="@+id/LayoutLogin"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_below="@+id/Login" app:passwordToggleTint="@android:color/darker_gray"
android:hint="Hasło" android:hint="Hasło"
android:gravity="center_horizontal|center_vertical" android:gravity="left">
android:inputType="none|textPassword" <EditText
android:textColor="#ff000000" android:layout_width="204.0dp"
android:textColorHint="#ff6c6767" /> 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 <Button
android:layout_width="100.5dp" android:layout_width="100.5dp"
android:layout_height="50dp" android:layout_height="50dp"
android:id="@+id/In" android:id="@+id/In"
android:layout_below="@id/Password" android:layout_below="@id/LayoutPassword"
android:layout_alignParentRight="false" android:layout_alignParentRight="false"
android:gravity="center" android:gravity="center"
android:onClick="SignIn" android:onClick="SignIn"
android:text="Zaloguj" android:text="Zaloguj"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:foregroundGravity="center" /> android:foregroundGravity="center" />
<Button <ImageButton
android:text=" Reset \n Hasła" android:src="@drawable/obraz4"
android:layout_width="100.5dp" android:layout_width="38.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"
android:layout_height="35.0dp" android:layout_height="35.0dp"
android:id="@+id/help" android:id="@+id/backLogowanie"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_alignParentRight="true" android:layout_alignParentLeft="true"
android:background="#ff0b31c8" android:background="#ffbdd7f0"
android:textColor="#fffcfcfc"
android:gravity="center" android:gravity="center"
android:onClick="HelpLoginScreen" /> android:onClick="GoToStart"/>
<TextView <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:textAppearance="?android:attr/textAppearanceSmall"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -79,15 +88,5 @@
android:textColor="#ff000000" android:textColor="#ff000000"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_centerHorizontal="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> </RelativeLayout>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View 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>

View File

@ -1,96 +1,127 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout <RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" 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:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="#ffbdd7f0"> android:background="#ffbdd7f0">
<android.support.design.widget.TextInputLayout
<android.support.design.widget.TextInputEditText android:id="@+id/LayoutName"
android:layout_width="204.0dp" android:layout_width="wrap_content"
android:layout_height="58.0dp" android:layout_height="wrap_content"
android:minWidth="25px" android:layout_centerHorizontal="true"
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:hint="Imie" android:hint="Imie"
android:gravity="center" android:layout_alignParentLeft="true">
android:inputType="none|textPersonName" /> <android.support.design.widget.TextInputEditText
<android.support.design.widget.TextInputEditText android:layout_width="204.0dp"
android:layout_width="204.0dp" android:layout_height="58.0dp"
android:layout_height="58.0dp" android:minWidth="25px"
android:minWidth="25px" android:minHeight="25px"
android:minHeight="25px" android:id="@+id/Name"
android:id="@+id/Surname" 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:hint="Nazwisko"
android:textColorHint="#ff6c6767" android:layout_below="@id/LayoutName"
android:layout_below="@id/Name" android:layout_alignParentLeft="true">
android:gravity="center" <android.support.design.widget.TextInputEditText
android:textColor="#ff000000" android:layout_width="204.0dp"
android:inputType="none|textPersonName" /> android:layout_height="58.0dp"
<android.support.design.widget.TextInputEditText android:minWidth="25px"
android:layout_width="204.0dp" android:minHeight="25px"
android:layout_height="58.0dp" android:id="@+id/Surname"
android:minWidth="25px" android:textColorHint="#ff6c6767"
android:minHeight="25px" android:layout_below="@id/Name"
android:id="@+id/Email" android:textColor="#ff000000"
android:layout_below="@+id/NewLogin" android:inputType="none|textPersonName" />
android:hint="Email" </android.support.design.widget.TextInputLayout>
android:gravity="center" <android.support.design.widget.TextInputLayout
android:textColorHint="#ff6c6767" android:id="@+id/LayoutEmail"
android:textColor="#ff000000" android:layout_width="wrap_content"
android:inputType="none|textEmailAddress" /> android:layout_height="wrap_content"
<android.support.design.widget.TextInputEditText android:layout_centerHorizontal="true"
android:layout_width="204.0dp" android:hint="Adres email"
android:layout_height="58.0dp" android:layout_below="@id/LayoutSurname"
android:minWidth="25px" android:layout_alignParentLeft="true">
android:minHeight="25px" <android.support.design.widget.TextInputEditText
android:id="@+id/NewPassword" 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:hint="Hasło"
android:layout_below="@+id/Email" android:layout_below="@id/LayoutEmail"
android:gravity="center" android:layout_alignParentLeft="true">
android:inputType="none|textPassword" <android.support.design.widget.TextInputEditText
android:textColorHint="#ff6c6767" /> android:layout_width="204.0dp"
<android.support.design.widget.TextInputEditText android:layout_height="58.0dp"
android:layout_width="204.0dp" android:minWidth="25px"
android:layout_height="58.0dp" android:minHeight="25px"
android:minWidth="25px" android:textColor="#ff000000"
android:minHeight="25px" android:textColorHint="#ff6c6767"
android:id="@+id/RepeatPassword" android:id="@+id/NewPassword"
android:layout_below="@+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:hint="Powtórz hasło"
android:inputType="none|textPassword" app:passwordToggleEnabled="true"
android:gravity="center" app:passwordToggleTint="@android:color/darker_gray"
android:textColorHint="#ff6c6767" android:layout_below="@id/LayoutNewPassword1"
android:textColor="#ff000000" /> android:layout_alignParentLeft="true">
<android.support.design.widget.TextInputEditText <android.support.design.widget.TextInputEditText
android:layout_width="204.0dp" android:layout_width="204.0dp"
android:layout_height="58.0dp" android:layout_height="58.0dp"
android:minWidth="25px" android:minWidth="25px"
android:minHeight="25px" android:minHeight="25px"
android:id="@+id/NewLogin" 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:hint="Login"
android:gravity="center" android:layout_below="@id/LayoutNewPassword2"
android:textColorHint="#ff6c6767" android:layout_alignParentLeft="true">
android:textColor="#ff000000" <android.support.design.widget.TextInputEditText
android:layout_below="@+id/Surname" /> android:layout_width="204.0dp"
<Switch android:layout_height="58.0dp"
android:layout_width="wrap_content" android:minWidth="25px"
android:layout_height="wrap_content" android:minHeight="25px"
android:id="@+id/PasswordSee1" android:id="@+id/NewLogin"
android:layout_toRightOf="@id/NewPassword" android:textColor="#ff000000"
android:layout_below="@id/Email" /> android:layout_below="@+id/Surname" />
<Switch </android.support.design.widget.TextInputLayout>
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" />
<Button <Button
android:text=" Załóż \n konto" android:text=" Załóż \n konto"
android:layout_width="100.5dp" android:layout_width="100.5dp"
@ -98,21 +129,13 @@
android:id="@+id/SignUp" android:id="@+id/SignUp"
android:autoSizeTextType="uniform" android:autoSizeTextType="uniform"
android:gravity="center" android:gravity="center"
android:layout_below="@id/RepeatPassword" android:layout_below="@id/LayoutNewLogin"
android:layout_alignParentRight="false" android:layout_alignParentRight="false"
android:foregroundGravity="center" android:foregroundGravity="center"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:onClick="SignUp" /> android:onClick="SignUp" />
<TextView <TextView
android:textAppearance="?android:attr/textAppearanceSmall" android:text="Poszukiwacz 2021"
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:textAppearance="?android:attr/textAppearanceSmall" android:textAppearance="?android:attr/textAppearanceSmall"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -120,7 +143,35 @@
android:textColor="#ff000000" android:textColor="#ff000000"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_centerHorizontal="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> </RelativeLayout>

View File

@ -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>

View File

@ -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>

View File

@ -4,7 +4,7 @@
<style name="MainTheme" parent="MainTheme.Base"> <style name="MainTheme" parent="MainTheme.Base">
</style> </style>
<!-- Base theme applied no matter what API --> <!-- 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:--> <!--If you are using revision 22.1 please use just windowNoTitle. Without android:-->
<item name="windowNoTitle">true</item> <item name="windowNoTitle">true</item>
<!--We will be using the toolbar so no need to show ActionBar--> <!--We will be using the toolbar so no need to show ActionBar-->
@ -20,6 +20,7 @@
<!-- You can also set colorControlNormal, colorControlActivated <!-- You can also set colorControlNormal, colorControlActivated
colorControlHighlight and colorSwitchThumbNormal. --> colorControlHighlight and colorSwitchThumbNormal. -->
<item name="windowActionModeOverlay">true</item> <item name="windowActionModeOverlay">true</item>
<item name="android:textColorHint">#ff000000</item>
<item name="android:datePickerDialogTheme">@style/AppCompatDialogStyle</item> <item name="android:datePickerDialogTheme">@style/AppCompatDialogStyle</item>
</style> </style>

View File

@ -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>

View 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"
]
}
}
}

View 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);
}
}
}

View 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);
}
}
}
}

View 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);
}
}
}

View File

@ -1,7 +1,9 @@
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Serwer.Infrastructure.DTO; using Serwer.Infrastructure.DTO;
using Serwer.Infrastructure.Services; using Serwer.Infrastructure.Services;
using Serwer.Infrastructure.ViewModels;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -20,17 +22,25 @@ namespace Serwer.Api.Controllers
} }
[HttpPost("Register")] [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(); return Ok();
} }
[HttpPost("SignIn")] [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); return Ok(user);
} }

View 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}");
}
}
}

View File

@ -21,6 +21,7 @@ namespace Serwer.Api
.ConfigureWebHostDefaults(webBuilder => .ConfigureWebHostDefaults(webBuilder =>
{ {
webBuilder.UseStartup<Startup>(); webBuilder.UseStartup<Startup>();
webBuilder.UseUrls("http://localhost:5001");
}); });
} }
} }

View File

@ -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"
}
}

View File

@ -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')]"
}
}
]
}
}
}
]
}

View File

@ -22,7 +22,7 @@
"dotnetRunMessages": "true", "dotnetRunMessages": "true",
"launchBrowser": true, "launchBrowser": true,
"launchUrl": "swagger", "launchUrl": "swagger",
"applicationUrl": "https://localhost:5001;http://localhost:5000", "applicationUrl": "http://localhost:5001;https://localhost:5000",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }

View File

@ -0,0 +1,8 @@
{
"dependencies": {
"apis1": {
"resourceId": "/subscriptions/[parameters('subscriptionId')]/resourceGroups/[parameters('resourceGroupName')]/providers/Microsoft.ApiManagement/service/SerwerApiapi/apis/SerwerApi",
"type": "apis.azure"
}
}
}

View File

@ -0,0 +1,7 @@
{
"dependencies": {
"apis1": {
"type": "apis"
}
}
}

View File

@ -4,6 +4,10 @@
<TargetFramework>net5.0</TargetFramework> <TargetFramework>net5.0</TargetFramework>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<Content Remove="wwwroot\tessdata\eng.traineddata" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.0" NoWarn="NU1605" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.0" NoWarn="NU1605" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" 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" /> <ProjectReference Include="..\Serwer.Infrastructure\Serwer.Infrastructure.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="wwwroot\tessdata\eng.traineddata" />
</ItemGroup>
</Project> </Project>

View File

@ -15,6 +15,7 @@ using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Tokens; using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models; using Microsoft.OpenApi.Models;
using Serwer.Api.Framework;
using Serwer.Core.Repositories; using Serwer.Core.Repositories;
using Serwer.Infrastructure.Mappers; using Serwer.Infrastructure.Mappers;
using Serwer.Infrastructure.Repositories; using Serwer.Infrastructure.Repositories;
@ -25,12 +26,14 @@ namespace Serwer.Api
{ {
public class Startup public class Startup
{ {
public Startup(IConfiguration configuration) public Startup(IConfiguration configuration, IWebHostEnvironment env)
{ {
Configuration = configuration; Configuration = configuration;
WebRootPath = env.WebRootPath;
} }
public IConfiguration Configuration { get; } 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. // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services) public void ConfigureServices(IServiceCollection services)
@ -39,8 +42,30 @@ namespace Serwer.Api
services.AddSwaggerGen(c => services.AddSwaggerGen(c =>
{ {
c.SwaggerDoc("v1", new OpenApiInfo { Title = "Serwer.Api", Version = "v1" }); 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() var jwtSettings = new JwtSettings()
{ {
Issuer = "PoszukiwaczInc", Issuer = "PoszukiwaczInc",
@ -60,26 +85,37 @@ namespace Serwer.Api
}; };
}); });
services.AddSingleton<IHostEnviroment>(hostEnviroment);
services.AddSingleton<IMapper>(AutoMapperConfig.Initialize()); services.AddSingleton<IMapper>(AutoMapperConfig.Initialize());
services.AddSingleton<IJwtHandler, JwtHandler>(sp => new JwtHandler(jwtSettings)); services.AddSingleton<IJwtHandler, JwtHandler>(sp => new JwtHandler(jwtSettings));
services.AddScoped<IUserRepository, UserRepository>(); services.AddScoped<IUserRepository, UserRepository>();
services.AddScoped<IHistoryRepository, HistoryRepository>();
services.AddScoped<IImageHandler, ImageHandler>();
services.AddScoped<IUserService, UserService>(); 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. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{ {
app.UseCors(builder =>
{
builder.AllowAnyHeader();
builder.AllowAnyMethod();
builder.AllowAnyOrigin();
});
if (env.IsDevelopment()) if (env.IsDevelopment())
{ {
app.UseDeveloperExceptionPage(); app.UseDeveloperExceptionPage();
app.UseSwagger(); //app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Serwer.Api v1")); //app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Serwer.Api v1"));
} }
app.UseHttpsRedirection();
app.UseRouting(); app.UseRouting();
app.UseMiddleware(typeof(ExceptionHandlerMiddleware));
app.UseAuthentication(); app.UseAuthentication();
app.UseAuthorization(); app.UseAuthorization();

Binary file not shown.

After

Width:  |  Height:  |  Size: 932 B

Binary file not shown.

Binary file not shown.

Binary file not shown.

View 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);
}
}

View 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
{
}
}

View File

@ -18,21 +18,22 @@ namespace Serwer.Core.Domain
public DateTime UpdatedAt { get; protected set; } public DateTime UpdatedAt { get; protected set; }
protected User() { } 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); SetEmail(email);
SetName(name); SetName(name);
SetSurname(surname); SetSurname(surname);
SetLogin(login); SetLogin(login);
SetPassword(password); SetPassword(password);
CreatedAt = DateTime.UtcNow;
} }
public void SetEmail(string email) public void SetEmail(string email)
{ {
if (string.IsNullOrWhiteSpace(email)) if (string.IsNullOrWhiteSpace(email))
{ {
throw new Exception("Email cannot be empty"); throw new Exception("Email nie może być pusty.");
} }
if (Email == email) if (Email == email)
{ {
@ -47,7 +48,7 @@ namespace Serwer.Core.Domain
{ {
if (string.IsNullOrWhiteSpace(name)) if (string.IsNullOrWhiteSpace(name))
{ {
throw new Exception("Name cannot be empty"); throw new Exception("Imię nie może być puste.");
} }
if (Name == name) if (Name == name)
{ {
@ -62,7 +63,7 @@ namespace Serwer.Core.Domain
{ {
if (string.IsNullOrWhiteSpace(surname)) if (string.IsNullOrWhiteSpace(surname))
{ {
throw new Exception("Surname cannot be empty"); throw new Exception("Nazwisko nie może być puste.");
} }
if (Surname == surname) if (Surname == surname)
{ {
@ -77,7 +78,7 @@ namespace Serwer.Core.Domain
{ {
if (string.IsNullOrWhiteSpace(login)) if (string.IsNullOrWhiteSpace(login))
{ {
throw new Exception("Login cannot be empty"); throw new Exception("Login nie może być pusty.");
} }
if (Login == login) if (Login == login)
{ {
@ -92,7 +93,7 @@ namespace Serwer.Core.Domain
{ {
if (string.IsNullOrWhiteSpace(password)) if (string.IsNullOrWhiteSpace(password))
{ {
throw new Exception("Password cannot be empty"); throw new Exception("Hasło nie może być puste.");
} }
if (Password == password) if (Password == password)
{ {

View 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);
}
}
}

View 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);
}
}

View 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; }
}
}

View File

@ -8,6 +8,7 @@ namespace Serwer.Infrastructure.DTO
{ {
public class UserDto public class UserDto
{ {
public Guid Id { get; set; }
public string Email { get; set; } public string Email { get; set; }
public string Name { get; set; } public string Name { get; set; }
public string Surname { get; set; } public string Surname { get; set; }

View 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; }
}
}

View 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;
}
}

View File

@ -15,6 +15,7 @@ namespace Serwer.Infrastructure.Mappers
=> new MapperConfiguration(cfg => => new MapperConfiguration(cfg =>
{ {
cfg.CreateMap<User, UserDto>(); cfg.CreateMap<User, UserDto>();
cfg.CreateMap<UserHistory, UserHistoryDto>();
}) })
.CreateMapper(); .CreateMapper();
} }

View File

@ -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);
}
}
}

View 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);
}
}
}

View 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);
}
}

View 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);
}
}

View 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);
}
}

View File

@ -1,4 +1,5 @@
using Serwer.Infrastructure.DTO; using Serwer.Infrastructure.DTO;
using Serwer.Infrastructure.ViewModels;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -11,5 +12,6 @@ namespace Serwer.Infrastructure.Services
{ {
Task RegisterAsync(string email, string name, string surname, string login, string password); Task RegisterAsync(string email, string name, string surname, string login, string password);
Task<SignedUserDto> SignInAsync(string login, string password); Task<SignedUserDto> SignInAsync(string login, string password);
Task<UserDto> UpdateAsync(UpdateUserModel userModel);
} }
} }

View 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;
}
}
}

View 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;
}
}
}
}
}

View File

@ -3,6 +3,7 @@ using Serwer.Core.Domain;
using Serwer.Core.Repositories; using Serwer.Core.Repositories;
using Serwer.Infrastructure.DTO; using Serwer.Infrastructure.DTO;
using Serwer.Infrastructure.Mappers; using Serwer.Infrastructure.Mappers;
using Serwer.Infrastructure.ViewModels;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -28,9 +29,9 @@ namespace Serwer.Infrastructure.Services
{ {
if(await _userRepository.GetAsync(login) != null) 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); await _userRepository.AddAsync(user);
} }
@ -39,11 +40,11 @@ namespace Serwer.Infrastructure.Services
var user = await _userRepository.GetAsync(login); var user = await _userRepository.GetAsync(login);
if(user == null) if(user == null)
{ {
throw new Exception("User not found."); throw new Exception("Nie znaleziono użytkownika.");
} }
if(user.Password != password) if(user.Password != password)
{ {
throw new Exception("Incorrect password."); throw new Exception("Hasło niepoprawne.");
} }
var jwt = _jwtHandler.CreateToken(user.Id); var jwt = _jwtHandler.CreateToken(user.Id);
@ -54,5 +55,24 @@ namespace Serwer.Infrastructure.Services
Jwt = _mapper.Map<JwtDto>(jwt) 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);
}
} }
} }

View File

@ -6,12 +6,31 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="AutoMapper" Version="10.1.1" /> <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="Microsoft.IdentityModel.Tokens" Version="6.8.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.8.0" /> <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.8.0" />
<PackageReference Include="Tesseract" Version="4.1.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Serwer.Core\Serwer.Core.csproj" /> <ProjectReference Include="..\Serwer.Core\Serwer.Core.csproj" />
</ItemGroup> </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> </Project>

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View 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; }
}
}

View File

@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 16
VisualStudioVersion = 16.0.30717.126 VisualStudioVersion = 16.0.30717.126
MinimumVisualStudioVersion = 10.0.40219.1 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}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Serwer.Core", "Serwer.Core\Serwer.Core.csproj", "{115E0BB1-FCC1-4E45-92B0-D3B6B4A3DA82}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Serwer.Infrastructure", "Serwer.Infrastructure\Serwer.Infrastructure.csproj", "{523E9EE6-B8D9-4E08-A9A0-50D7F872C79C}" 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 Release|Any CPU = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution 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.ActiveCfg = Debug|Any CPU
{115E0BB1-FCC1-4E45-92B0-D3B6B4A3DA82}.Debug|Any CPU.Build.0 = 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 {115E0BB1-FCC1-4E45-92B0-D3B6B4A3DA82}.Release|Any CPU.ActiveCfg = Release|Any CPU