Sunteți pe pagina 1din 19

Ministerul Educaţiei, Culturii și Cercetării al Republicii Moldova

Universitatea Tehnică a Moldovei


Departamentul Ingineria Software și Automatică

RAPORT
Lucrare de laborator Nr.2
Disciplina: Programarea aplicațiilor mobile
Tema: Organiser Mobile Application

A efectuat: st.gr. TI-192,


Ciobanu Ecaterina

A verificat : asist.univ.
Rusu Cristian

Chișinău 2021
Scopul lucrării: 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. AddActivity

 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.

Codul:
MainActivity
package com.pamlab2;

import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.Settings;
import android.util.Log;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

public class MainActivity extends AppCompatActivity {

@SuppressLint("StaticFieldLeak")
public static Activity activity;
public static String datafile =
"/storage/emulated/0/Android/data/com.anagh.pamlab2/data.xml";

public String dataStr = "";

public static Document doc = null;

public static final String NOTIFICATION_CHANNEL_ID = "10001" ;


private final static String default_notification_channel_id = "default" ;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activity = this;
startService(new Intent(this, MyBroadcastReceiverService.class));

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {


if (!Environment.isExternalStorageManager()){
ActivityCompat.requestPermissions(this, new
String[]{Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.MANAGE_EXTERNAL_STORAGE}, 1);
Intent intent = new Intent();

intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", this.getPackageName(),
null);
intent.setData(uri);
startActivity(intent);
}
}

try {

if(new File(datafile).exists()) {
dataStr = readFile(datafile);
doc = myDoc();
log("Doc: "+dataStr, 1);
}
else{
log("Creating new file...", 1);

File f1;

f1 = new File(datafile);

if(!f1.exists()){
f1.createNewFile();
f1.setWritable(true);
f1.setReadable(true);
f1.setExecutable(true);
}

new File(datafile).createNewFile();

DocumentBuilder builder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
doc = builder.newDocument();

// default blank element


Element root = doc.createElement("Notes");
doc.appendChild(root);

Element note = doc.createElement("Note");


note.appendChild(createNoteElements(doc, "id", "1"));
note.appendChild(createNoteElements(doc, "title", ""));
note.appendChild(createNoteElements(doc, "message", ""));
note.appendChild(createNoteElements(doc, "date", ""));
note.appendChild(createNoteElements(doc, "time", ""));
doc.getElementsByTagName("Notes").item(0).appendChild(note);
dataStr = docStr(doc);

Transformer tr =
TransformerFactory.newInstance().newTransformer();
tr.setOutputProperty(OutputKeys.INDENT, "yes");
tr.transform(new DOMSource(doc), new StreamResult(new
File(datafile)));
}
} catch (IOException | ParserConfigurationException |
TransformerException e) {
e.printStackTrace();
}

getArray(doc);

Button add = findViewById(R.id.add);


add.setOnClickListener(v -> {
Intent addIntent = new Intent(this, addActivity.class);
startActivity(addIntent);
});

refreshList();

getDate();
}

public void getDate(){


log("=========================================", 1);
String date = "11.10.2021";
String time = "10:17";

String sDate1 = date + " " + time;


SimpleDateFormat formatter1=new SimpleDateFormat("dd.MM.yyyy HH:mm");
Date date1 = null;
try {
date1 = formatter1.parse(sDate1);
System.out.println(date1);
} catch (ParseException e) {
e.printStackTrace();
}
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy
HH:mm:ss");
Date dates = new Date();
System.out.println(formatter.format(dates));

int Sec = (int) ((date1.getTime() - dates.getTime())/1000);


System.out.println(Sec);

log("=========================================", 1);
}

public static void refreshList(){


ListView listview;
MyArrayAdapter noteArrayAdapter;
ArrayList<Note> noteArray = new ArrayList<>();

NodeList nodes = doc.getElementsByTagName("Note");


for (int i = 0; i < nodes.getLength(); i++) {
Element el = (Element) nodes.item(i);
String id =
el.getElementsByTagName("id").item(0).getTextContent();
String title =
el.getElementsByTagName("title").item(0).getTextContent();
String message =
el.getElementsByTagName("message").item(0).getTextContent();
String date =
el.getElementsByTagName("date").item(0).getTextContent();
String time =
el.getElementsByTagName("time").item(0).getTextContent();

if (i > 0) noteArray.add(new Note(title, message, date, time,


id));

noteArrayAdapter = new MyArrayAdapter(activity,


R.layout.activity_listview, noteArray);
listview = activity.findViewById(R.id.listView);
listview.setItemsCanFocus(false);
listview.setFocusableInTouchMode(false);
listview.setAdapter(noteArrayAdapter);

listview.setOnItemClickListener((parent, v, position, itemID) ->


{
System.out.println("HEEEy");
Toast.makeText(activity, "List Item Clicked:" + position,
Toast.LENGTH_LONG).show();
});

public Document myDoc() {


DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = null;
try {
db = dbf.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(dataStr));

try {
assert db != null;
return db.parse(is);
} catch (IOException | SAXException e) {
e.printStackTrace();
}
return doc;
}

static String readFile(String file) throws IOException {


FileInputStream fileInputStream = new FileInputStream(file);
byte[] buffer = new byte[fileInputStream.available()];
int length = fileInputStream.read(buffer);
fileInputStream.close();
return new String(buffer, 0, length, StandardCharsets.UTF_8);
}

private static Node createNoteElements(Document doc, String name, String


value) {
Element node = doc.createElement(name);
node.appendChild(doc.createTextNode(value));
return node;
}

public void getArray(Document doc){


NodeList nodes = doc.getElementsByTagName("Note");

log("=============================================", 0);
System.out.println(nodes.getLength());
for (int i = 0; i < nodes.getLength(); i++) {
Element el = (Element) nodes.item(i);
String id =
el.getElementsByTagName("id").item(0).getTextContent();
String title =
el.getElementsByTagName("title").item(0).getTextContent();
String message =
el.getElementsByTagName("message").item(0).getTextContent();
String date =
el.getElementsByTagName("date").item(0).getTextContent();
String time =
el.getElementsByTagName("time").item(0).getTextContent();
log(id + " - " + title + " - " + message + " - " + date + " - " +
time, 0);
}
log("=============================================", 0);

public static void removeNote(Document doc, String id) throws


TransformerException {
NodeList nodes = doc.getElementsByTagName("Note");

for (int i = 0; i < nodes.getLength(); i++) {


Element note = (Element) nodes.item(i);
String idValue =
note.getElementsByTagName("id").item(0).getTextContent();
if (idValue.equals(id)) {
note.getParentNode().removeChild(note);
}
}
Transformer tr = TransformerFactory.newInstance().newTransformer();
tr.setOutputProperty(OutputKeys.INDENT, "yes");
tr.transform(new DOMSource(doc), new StreamResult(new
File(datafile)));
}

public String docStr(Document doc) throws TransformerException {


Transformer transformer =
TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");

StreamResult result = new StreamResult(new StringWriter());


DOMSource source = new DOMSource(doc);
transformer.transform(source, result);

return result.getWriter().toString();
}

public void log(String message, int type){


// type == 1 => log.v
// type == 2 => toast
// type == undefined => system.log
if(type == 1) Log.v("TAG", "My Log: " + message);
else if(type == 2) Toast.makeText(getApplicationContext(), message,
Toast.LENGTH_SHORT).show();
else System.out.println(message);
}

addActivity
package com.pamlab2;

import androidx.appcompat.app.AppCompatActivity;

import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

public class addActivity extends AppCompatActivity {

Document doc = null;


final Calendar myCalendar = Calendar.getInstance();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_activity);

EditText el_title = findViewById(R.id.title);


EditText el_message = findViewById(R.id.message);
EditText el_date = findViewById(R.id.date);
EditText el_time = findViewById(R.id.time);

/* Date Time picker */


DatePickerDialog.OnDateSetListener vDate = (view, year, monthOfYear,
dayOfMonth) -> {
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, monthOfYear);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateLabel(true);
};

el_date.setOnClickListener(v -> new


DatePickerDialog(addActivity.this, vDate, myCalendar.get(Calendar.YEAR),
myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH)).show());

TimePickerDialog.OnTimeSetListener vTime = (view, hour, min) -> {


myCalendar.set(Calendar.HOUR, hour);
myCalendar.set(Calendar.MINUTE, min);
updateLabel(false);
};

el_time.setOnClickListener(v -> new


TimePickerDialog(addActivity.this, vTime,
myCalendar.get(Calendar.HOUR_OF_DAY), myCalendar.get(Calendar.MINUTE),
true).show());
/* Date Time picker */

Button save = findViewById(R.id.saveBtn);


save.setOnClickListener(v -> {
String title = el_title.getText().toString();
String message = el_message.getText().toString();
String date = el_date.getText().toString();
String time = el_time.getText().toString();
if(title.isEmpty() || message.isEmpty() || date.isEmpty() ||
time.isEmpty()){
Toast.makeText(getApplicationContext(), "FILL ALL!",
Toast.LENGTH_SHORT).show();
}else{
doc = MainActivity.doc;

System.out.println(title + " - " + message + " - " + date + "


- " + time);
try {
addNote(doc, title, message, date, time);

stopService(new Intent(this,
MyBroadcastReceiverService.class));
startService(new Intent(this,
MyBroadcastReceiverService.class));

Intent returnIntent = new Intent();


MainActivity.doc = doc;

MainActivity.refreshList();

setResult(RESULT_OK, returnIntent);
finish();

} catch (TransformerException e) {
e.printStackTrace();
}
}
});
}

private void updateLabel(boolean isDate) {


if(isDate){
String myFormat = "dd.MM.yyyy";
SimpleDateFormat sdf = new SimpleDateFormat(myFormat,
Locale.ITALY);
EditText dateLabel = findViewById(R.id.date);
dateLabel.setText(sdf.format(myCalendar.getTime()));
}
else{
String myFormat = "hh:mm";
SimpleDateFormat sdf = new SimpleDateFormat(myFormat,
Locale.ITALY);
EditText timeLabel = findViewById(R.id.time);
timeLabel.setText(sdf.format(myCalendar.getTime()));
}
}

public void addNote(Document doc, String title, String message, String


date, String time) throws TransformerException {
Element note = doc.createElement("Note");

//note.setAttribute("id", id);
String id = String.valueOf(System.currentTimeMillis() / 1000L);
note.appendChild(createNoteElements(doc, "id", id));
note.appendChild(createNoteElements(doc, "title", title));
note.appendChild(createNoteElements(doc, "message", message));
note.appendChild(createNoteElements(doc, "date", date));
note.appendChild(createNoteElements(doc, "time", time));

doc.getElementsByTagName("Notes").item(0).appendChild(note);

Transformer tr = TransformerFactory.newInstance().newTransformer();
tr.setOutputProperty(OutputKeys.INDENT, "yes");
tr.transform(new DOMSource(doc), new StreamResult(new
File(MainActivity.datafile)));
}

private static Node createNoteElements(Document doc, String name, String


value) {
Element node = doc.createElement(name);
node.appendChild(doc.createTextNode(value));
return node;
}
}

editActivity
package com.pamlab2;

import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.Intent;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
public class editActivity extends AppCompatActivity {

final Calendar myCalendar = Calendar.getInstance();


Document doc = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_activity);

Bundle extras = getIntent().getExtras();


String title = extras.getString("edit_title"),
message = extras.getString("edit_message"),
edit_date = extras.getString("edit_date"),
edit_time = extras.getString("edit_time"),
id = extras.getString("edit_id");

EditText el_title = findViewById(R.id.title);


EditText el_message = findViewById(R.id.message);
EditText el_date = findViewById(R.id.date);
EditText el_time = findViewById(R.id.time);
TextView el_id = findViewById(R.id.id);

el_title.setText(title);
el_message.setText(message);
el_date.setText(edit_date);
el_time.setText(edit_time);
el_id.setText(id);

String noteId = (String) el_id.getText();

DatePickerDialog.OnDateSetListener date = (view, year, monthOfYear,


dayOfMonth) -> {
myCalendar.set(Calendar.YEAR, year);
myCalendar.set(Calendar.MONTH, monthOfYear);
myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateLabel(true);
};

el_date.setOnClickListener(v -> new


DatePickerDialog(editActivity.this, date, myCalendar.get(Calendar.YEAR),
myCalendar.get(Calendar.MONTH),
myCalendar.get(Calendar.DAY_OF_MONTH)).show());

TimePickerDialog.OnTimeSetListener time = (view, hour, min) -> {


myCalendar.set(Calendar.HOUR, hour);
myCalendar.set(Calendar.MINUTE, min);
updateLabel(false);
};

el_time.setOnClickListener(v -> new


TimePickerDialog(editActivity.this, time,
myCalendar.get(Calendar.HOUR_OF_DAY), myCalendar.get(Calendar.MINUTE),
true).show());
doc = MainActivity.doc;
Button save = findViewById(R.id.saveBtn);
save.setOnClickListener(v -> {
String upd_title = el_title.getText().toString();
String upd_message = el_message.getText().toString();
String upd_date = el_date.getText().toString();
String upd_time = el_time.getText().toString();

if(upd_title.isEmpty() || upd_message.isEmpty() ||
upd_date.isEmpty() || upd_time.isEmpty()){
Toast.makeText(getApplicationContext(), "FULL ALL!",
Toast.LENGTH_SHORT).show();
}else{

NodeList nodes = doc.getElementsByTagName("Note");


for (int i = 0; i < nodes.getLength(); i++) {
Element el = (Element) nodes.item(i);
String myid =
el.getElementsByTagName("id").item(0).getTextContent();
if(myid.equals(id)){

el.getElementsByTagName("title").item(0).setTextContent(upd_title);

el.getElementsByTagName("message").item(0).setTextContent(upd_message);

el.getElementsByTagName("date").item(0).setTextContent(upd_date);

el.getElementsByTagName("time").item(0).setTextContent(upd_time);

Transformer tr = null;
try {
tr =
TransformerFactory.newInstance().newTransformer();
} catch (TransformerConfigurationException e) {
e.printStackTrace();
}
assert tr != null;
tr.setOutputProperty(OutputKeys.INDENT, "yes");
try {
tr.transform(new DOMSource(doc), new
StreamResult(new File(MainActivity.datafile)));
} catch (TransformerException e) {
e.printStackTrace();
}

stopService(new Intent(this,
MyBroadcastReceiverService.class));
startService(new Intent(this,
MyBroadcastReceiverService.class));

Intent returnIntent = new Intent();


MainActivity.doc = doc;
MainActivity.refreshList();
setResult(RESULT_OK, returnIntent);

finish();
break;
}

}
}
});

Button remove = findViewById(R.id.removeBtn);


remove.setOnClickListener(v -> {
System.out.println("HEI");
try {
MainActivity.doc = doc;
MainActivity.removeNote(doc, noteId);
MainActivity.refreshList();

Intent returnIntent = new Intent();


setResult(RESULT_OK, returnIntent);
finish();

} catch (TransformerException e) {
e.printStackTrace();
}

});
}

private void updateLabel(boolean isDate) {


if(isDate){
String myFormat = "dd.MM.yyyy";
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
EditText dateLabel = findViewById(R.id.date);
dateLabel.setText(sdf.format(myCalendar.getTime()));
}
else{
String myFormat = "hh:mm";
SimpleDateFormat sdf = new SimpleDateFormat(myFormat, Locale.US);
EditText timeLabel = findViewById(R.id.time);
timeLabel.setText(sdf.format(myCalendar.getTime()));
}
}
}

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.anagh.pamlab2" >

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
/>
<uses-permission
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
/>
<uses-permission android:name = "android.permission.VIBRATE" />
<uses-permission android:name =
"android.permission.ACCESS_NOTIFICATION_POLICY" />

<application
android:allowBackup="true"
android:exported="false"
android:fullBackupContent="true"
android:grantUriPermissions="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.PAMLab2" >
<activity
android:name="com.anagh.pamlab2.addActivity"
android:exported="true" />
<activity
android:name="com.anagh.pamlab2.editActivity"
android:exported="true" />
<activity
android:name="com.anagh.pamlab2.MainActivity"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />


</intent-filter>
</activity>

<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true" >
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<receiver android:name="com.anagh.pamlab2.MyNotificationPublisher"
tools:ignore="Instantiatable" />
<service android:enabled="true"
android:name="com.anagh.pamlab2.MyBroadcastReceiverService" />
</application>

</manifest>
Fig. 1
Fig. 2
Fig. 3
Concluzie
Efectuând această lucare de laborator am învățat principiul de lucru cu elementele unei aplicații,
am făcut conoștință cu noțiunile de activitate, intenție, context, seviciu.

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