Sunteți pe pagina 1din 12

Ministerul Educației, Culturii și Cercetării

Universitatea Tehnică a Moldovei


Facultatea Calculatoare Informatică şi Microelectronică
Departamentul Ingineria Software și Automatică

Disciplina :
Programarea aplicațiilor mobile

Lucrarea de laborator nr. 2


Tema:
Organizer Mobile Application (DAILY PLANNER)

A efectuat: st. gr. TI-151 Arapu Ion

A verificat: asist. univ. Ciudin Sergiu

Chişinău – 2017
Scopul lucrării de laborator
De realizat aplicație tip Organiser pe platforma aleasă.
La formarea și proiectarea aplicațiilor sunt introduse puncte stricte,
ce sunt obligatorii de respectat. La discreția personală rămâne designul aplicației
și API-ul/Framework-ul în care va fi dezvoltată lucrarea de laborator #2. Componentele și
structura fiecărei Activități va fi descrisă mai jos.

UI Components
Aplicația va conține minim 3 Activități de baza care vor fi numerotate în lucrare sub forma:
1. MainActivity (structura/componente)

 Calendar View (custom or default)


 Buttons (Add/Remove/Update)
 Căutare (caută conform cuvintelor cheie)

2. AddtActivity

 Data/Time controller
 Info TextBox
 Buttons
 și altele (la discreție conform specificului aplicației)

3. UpdateActivity - practic e una și aceeași activitate de la Add, doar ca completata deja.

Datele operaționale din interiorul aplicației vor fi stocate în fișier/e XML forma cărora rămâne la
discreția
personală. (cuvinte cheie, XML Serialization).

Logical/Operational Component

Toate evenimentele și acțiunile de notificare/semnalizare (sonore/vizuale) intreprinse în


Organiser
vor fi tratate într-un serviciu aparte, care logic funcțional va extrage datele din acel fișier XML.

La discreția fiecărui rămâne tema/funcționalul aplicației. Exemplu cum se va modifica


tema(specificată in raport) :

Funcțional: Planificator al orarului de studii.


Tema: Student Organiser

Funcțional: Planificator al administrărilor medicamentoase.


Tema: Medication Reminder
Efectuararea lucrarii:
Figura 1 reprezinta interfata utilizatorului de selectare a unei date si functionalul ce-l
vizeaza. Aici se poate alege de a se adauga, sterge, modifica si vizualiza intrarile introduse.

Figura 1. MainActivity
Figura 2 reprezinta interfata de selectare a unei intrari iar in dependenta de originea
intentiei aceasta fie va fi afisata cu mai multe detalii, fie va fi stearsa sau va fi transmisa spre
editare.
Figura 2. DeliveryListActivity

Figura 3 reprezinta interfata de afisare a intrarii selectate.


Figura 3. ViewActivity

Figura 4 reprezinta interfata activitatii de adaugare a unei noi intrari. Aceasta cuprinde
posibilitatea de selectare a unei ore dar si campurile obligatorii: from-pozitia curenta, to- pozitia
finala a cursei, load-tipul incarcaturii si price – pretul serviciului.
Figura 4. AddtActivity

Concluzii

În această lucrare de laborator s-a creat un organizator ce vizeaza soferii de cursa lunga.
Acesta contine functinalul de adaugare, stergere, editare si vizualizare a datelor si serviciilor ce
trebuie efectuate. S-au folosit viziuni precum: CalendarView, Button, TextView, EditText,
TimePicker.
Anexa A
Fisierul „Files.cs”:

public class Files


{
public static readonly string Documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
public static readonly string Filename = Path.Combine(Documents, "Deliveries.json");

public static void Save(Delivery delivery)


{
var list = JsonConvert.DeserializeObject<List<Delivery>>(File.ReadAllText(Filename)) ?? new List<Delivery>();
list.Add(delivery);
var newlist = JsonConvert.SerializeObject(list, Formatting.Indented);
File.WriteAllText(Filename, newlist);
}

public static void Save(List<Delivery> deliveryList)


{
var newlist = JsonConvert.SerializeObject(deliveryList, Formatting.Indented);
File.WriteAllText(Filename, newlist);
}

public static void Truncate()


{
using (File.Open(Filename, FileMode.Truncate)) { }
}

public static List<Delivery> GetAllDeliveries()


{
if (new FileInfo(Filename).Length != 0)
{
return JsonConvert.DeserializeObject<List<Delivery>>(File.ReadAllText(Filename)).ToList();
}
return null;
}

public static List<Delivery> GetDeliveriesByDate(DateTime dateTime)


{
return GetAllDeliveries()?.FindAll(x => x.EndDelivery.Date == dateTime.Date &&
x.EndDelivery.Month == dateTime.Month &&
x.EndDelivery.Year == dateTime.Year);
}

public static List<Delivery> GetDeliveriesByKeyword(string word)


{
return GetAllDeliveries()?.FindAll(x => x.StartPosition.Contains(word) ||
x.EndPosition.Contains(word) ||
x.Load.Contains(word));
}

public static void Edit(Delivery old, Delivery _new)


{
List<Delivery> list = GetAllDeliveries();

var index = list.FindIndex(x => x.EndDelivery == old.EndDelivery &&


x.StartDelivery == old.StartDelivery);
list[index] = _new;
Save(list);
}

public static void Remove(Delivery delivery)


{
List<Delivery> list = GetAllDeliveries();
var index = list.FindIndex(x => x.EndDelivery == delivery.EndDelivery &&
x.StartDelivery == delivery.StartDelivery);
list.RemoveAt(index);
Save(list);
}
}

Fisierul “Helpers.cs”:
public enum NotificationType { None, Day, Hour, HalfHour }

public enum Scope { ToEdit, ToView, ToRemove, ToSearch }

public class Param


{
public Scope Scope { get; set; }
public DateTime DateTime { get; set; }
public string Keyword { get; set; }
}

Fisierul „AddtActivity”
[Activity(Label = "Add new delivery")]
public class AddtActivity : Activity
{
private int MaxLength = 20;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.Addt);

TimePicker endDelivery = FindViewById<TimePicker>(Resource.Id.EndDelivery);


EditText from = FindViewById<EditText>(Resource.Id.From);
EditText to = FindViewById<EditText>(Resource.Id.To);
EditText load = FindViewById<EditText>(Resource.Id.Load);
EditText price = FindViewById<EditText>(Resource.Id.Price);
Button save = FindViewById<Button>(Resource.Id.Save);

var del = JsonConvert.DeserializeObject<Param>(Intent.GetStringExtra("ToAddt"));


price.SetRawInputType(Android.Text.InputTypes.ClassNumber);

from.TextChanged += OnTextChanged;
to.TextChanged += OnTextChanged;
load.TextChanged += OnTextChanged;
price.TextChanged += OnTextChanged;
save.Click += delegate
{
if (from.Text.Length != 0 && to.Text.Length != 0 &&
load.Text.Length != 0 && price.Text.Length != 0)
{
var temp = price.Text.All(char.IsNumber) ? Convert.ToInt32(price.Text) : 0;
var delivery = new Delivery
{
StartDelivery = DateTime.Now,
EndDelivery = new DateTime(del.DateTime.Year,
del.DateTime.Month, del.DateTime.Day,
endDelivery.Hour, endDelivery.Minute, 0),
Price = temp,
Load = load.Text,
StartPosition = from.Text,
EndPosition = to.Text
};

Files.Save(delivery);
StartActivity(new Intent(this, typeof(MainActivity)));
}
if(from.Text.Length == 0)
from.SetError("Insert the place's name where you start from!", null);
else if(to.Text.Length == 0)
to.SetError("Insert the place's name to which you deliver the load!", null);
else if(load.Text.Length == 0)
load.SetError("Insert the type of load you deliver!", null);
else if(price.Text.Length == 0)
price.SetError("Insert the price of load you deliver!", null);
};
}

private void OnTextChanged(object sender, EventArgs e)


{
if (sender is EditText view && view.Text.Length > MaxLength)
{
view.Text = view.Text.Remove(view.Text.Length - 1);
view.Text = view.Text;
}
}
}

Fisierul „ViewActivity.cs”:
[Activity(Label = "Delivery")]
public class ViewActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.View);
var delivery = JsonConvert.DeserializeObject<Delivery>(Intent.GetStringExtra("ToView"));

TextView from = FindViewById<TextView>(Resource.Id._From);


TextView to = FindViewById<TextView>(Resource.Id._To);
TextView load = FindViewById<TextView>(Resource.Id._Load);
TextView price = FindViewById<TextView>(Resource.Id._Price);
TextView remaining = FindViewById<TextView>(Resource.Id._Remaining);

from.Text = delivery.StartPosition;
to.Text = delivery.EndPosition;
load.Text = delivery.Load;
price.Text = delivery.Price + "$";
var diff = (delivery.EndDelivery - DateTime.Now);
remaining.Text = diff.Days + " days " + diff.Hours + "h " + diff.Minutes + "min";
}
}
Fisierul „DeliveryListActivity.cs”
[Activity(Label = "Select delivery")]
public class DeliveryListActivity : Activity
{
private ArrayAdapter<string> _adapter;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.DeliveryList);

var param = JsonConvert.DeserializeObject<Param>(Intent.GetStringExtra("ToDeliveryList"));


ListView listView = FindViewById<ListView>(Resource.Id.ListView);
List<string> items = new List<string>();

var list = param.Scope == Scope.ToSearch ? Files.GetDeliveriesByKeyword(param.Keyword)


: Files.GetDeliveriesByDate(param.DateTime);

if (list != null)
{
foreach (var l in list)
{
items.Add(l.EndDelivery.ToString(CultureInfo.CurrentCulture));
}
}

_adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItem1, items);


listView.Adapter = _adapter;

listView.ItemClick += (sender, e) =>


{
if (list != null)
{
var delivery = list[e.Position];

switch (param.Scope)
{
case Scope.ToEdit:
Intent intent = new Intent(this, typeof(UpdateActivity));
intent.PutExtra("ToUpdate", JsonConvert.SerializeObject(delivery));
StartActivity(intent);
break;

case Scope.ToSearch:
case Scope.ToView:
intent = new Intent(this, typeof(ViewActivity));
intent.PutExtra("ToView", JsonConvert.SerializeObject(delivery));
StartActivity(intent);
break;

case Scope.ToRemove:
Files.Remove(delivery);
StartActivity(new Intent(this, typeof(MainActivity)));
break;
}
}
};
}
}
Fisierul „MainActivity.cs”:
[Activity(Label = "Trucker Organizer", MainLauncher = true)]
public class MainActivity : Activity
{
protected override void OnCreate(Bundle savedInstanceState)
{
//Files.Truncate();
if (new FileInfo(Files.Filename).Length != 0)
{
StartService(new Intent(this, typeof(DeliveryService)));
}

base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.Main);

CalendarView calendar = FindViewById<CalendarView>(Resource.Id.Calendar);


Button add = FindViewById<Button>(Resource.Id.Add);
Button edit = FindViewById<Button>(Resource.Id.Edit);
Button remove = FindViewById<Button>(Resource.Id.Remove);
Button view = FindViewById<Button>(Resource.Id.View);
EditText keyword = FindViewById<EditText>(Resource.Id.Keyword);
Button search = FindViewById<Button>(Resource.Id.Search);

DateTime startDateTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);


DateTime currentTime = startDateTime.AddMilliseconds(calendar.Date).ToLocalTime();

add.Click += delegate
{
Intent intent = new Intent(this, typeof(AddtActivity));
var obj = new Param { DateTime = currentTime };
intent.PutExtra("ToAddt", JsonConvert.SerializeObject(obj));
StartActivity(intent);
};

edit.Click += delegate
{
Intent intent = new Intent(this, typeof(DeliveryListActivity));
var obj = new Param { DateTime = currentTime, Scope = Scope.ToEdit };
intent.PutExtra("ToDeliveryList", JsonConvert.SerializeObject(obj));
StartActivity(intent);

};

view.Click += delegate
{
Intent intent = new Intent(this, typeof(DeliveryListActivity));
var obj = new Param {DateTime = currentTime, Scope = Scope.ToView};
intent.PutExtra("ToDeliveryList", JsonConvert.SerializeObject(obj));
StartActivity(intent);
};

remove.Click += delegate
{
Intent intent = new Intent(this, typeof(DeliveryListActivity));
var obj = new Param { DateTime = currentTime, Scope = Scope.ToRemove };
intent.PutExtra("ToDeliveryList", JsonConvert.SerializeObject(obj));
StartActivity(intent);
};

search.Click += delegate
{
if (keyword.Text.Length > 0)
{
Intent intent = new Intent(this, typeof(DeliveryListActivity));
var obj = new Param { Keyword = keyword.Text, Scope = Scope.ToSearch
};
intent.PutExtra("ToDeliveryList", JsonConvert.SerializeObject(obj));
StartActivity(intent);
}
//keyword.SetError("This field can not be empty", null);
};
}
}

S-ar putea să vă placă și