Documente Academic
Documente Profesional
Documente Cultură
RAPORT
Lucrare de laborator Nr.2
Disciplina: Programarea aplicațiilor mobile
Tema: Organiser Mobile Application
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)
2. AddActivity
Data/Time controller
Info TextBox
Buttons
și altele (la discreție conform specificului aplicației)
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
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;
@SuppressLint("StaticFieldLeak")
public static Activity activity;
public static String datafile =
"/storage/emulated/0/Android/data/com.anagh.pamlab2/data.xml";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activity = this;
startService(new Intent(this, MyBroadcastReceiverService.class));
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();
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);
refreshList();
getDate();
}
log("=========================================", 1);
}
try {
assert db != null;
return db.parse(is);
} catch (IOException | SAXException e) {
e.printStackTrace();
}
return doc;
}
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);
return result.getWriter().toString();
}
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;
stopService(new Intent(this,
MyBroadcastReceiverService.class));
startService(new Intent(this,
MyBroadcastReceiverService.class));
MainActivity.refreshList();
setResult(RESULT_OK, returnIntent);
finish();
} catch (TransformerException e) {
e.printStackTrace();
}
}
});
}
//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)));
}
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 {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_activity);
el_title.setText(title);
el_message.setText(message);
el_date.setText(edit_date);
el_time.setText(edit_time);
el_id.setText(id);
if(upd_title.isEmpty() || upd_message.isEmpty() ||
upd_date.isEmpty() || upd_time.isEmpty()){
Toast.makeText(getApplicationContext(), "FULL ALL!",
Toast.LENGTH_SHORT).show();
}else{
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));
finish();
break;
}
}
}
});
} catch (TransformerException e) {
e.printStackTrace();
}
});
}
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" />
<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.