Κεφάλαιο 1. Στόχος και σκοπός της εργασίας



Σχετικά έγγραφα
Android Studio για Windows

ANDROID Προγραμματισμός Εφαρμογών

Σύντομη περιγραφή 5. Για να ξεκινήσετε 6. Οι οθόνες του προγράμματος 8. Εγκατάσταση προγράμματος 6 Δημιουργία κωδικών χρήστη 7

Αντικειμενοστρεφής Προγραμματισμός

Εισαγωγικές έννοιες. Ιωάννης Γ. Τσούλος 2014

Vodafone Business Connect

Ξεκινώντας με το MIT Αρρ Inventor. 1 η Εργασία

Βρίγκας Μιχαήλ Α.Μ.744 Μπράχος Χ. Ευάγγελος Α.Μ.795

Εισαγωγή στην εφαρμογή Βασική Σελίδα (Activity) Αναζήτηση Πελάτη... 6 Προβολή Πελάτη... 7 Επεξεργασία Πελάτη... 10

ΠΑΡΑΡΤΗΜΑ ΓΡΕΒΕΝΩΝ ΤΜΗΜΑ ΕΠΙΧΕΙΡΗΣΙΑΚΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ

Δημιουργία μιας εφαρμογής Java με το NetBeans

Pylon Entry. Πόροι. Στη διαδικασία αυτή περιγράφεται η Δημιουργία- Μεταβολή-Διαγραφή Αναζήτηση Πόρων

Android Studio για Linux

Field Service Management ΕΓΧΕΙΡΙΔΙΟ ΧΡΗΣΗΣ

Δημιουργία ιστοσελίδας με. Wordpress - Βασικές λειτουργίες

ΕΡΓΑΣΙΑ 2 - MOODLE ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Ακ. Έτος ΔΙΔΑΣΚΩΝ: Π. Εφραιμίδης. Υπεύθυνος εργαστηρίου: Α. Κουτσιαμάνης

Epsilon Net PYLON Platform

Δομές Δεδομένων. Σημειώσεις από το εργαστήριο για τον χειρισμό του προγράμματος Eclipse. 5ο εξάμηνο. v1.0

Δημιουργώντας μια εφαρμογή ζωγραφικής. 2 ο Μάθημα

Εγγραφή στο Portal για νέους συνδρομητές

ΕΓΧΕΙΡΙΔΙΟ ΟΔΗΓΙΩΝ ΧΡΗΣΤΗ. Ηλεκτρονική Υποβολή Α.Π.Δ.

8 Maps. 8.1 Δημουργία Activity με χάρτη

Οδηγίες για την εγκατάσταση του πακέτου Cygwin

2.1 Σύνδεση Εξωτερικής Συσκευής στο IDE

QEMS TUTORIAL CRM. Οδηγίες για το νέο πρωτοποριακό πρόγραμμα της QEMS.

Σημειώσεις για τις Ιστοσελίδες του Google

ΟΔΗΓΙΕΣ ΣΥΝΔΕΣΗΣ ΣΤΟ ΑΣΥΡΜΑΤΟ ΔΙΚΤΥΟ eduroam

Κεφάλαιο 5. Δημιουργία φορμών για τη βάση δεδομένων DVDclub

«Οδηγίες χρήσης εφαρμογής Ενιαίου Συστήματος Πληρωμών»

Μπορείτε τα δείτε βιντεάκι με τη διαδικασία εδώ:

Οδηγίες για smartphone ή tablet με λογισμικό Android

Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010

SocialSkip Service v2.0

Είσοδος. Καλωσορίσατε στο Ενιαίο Σύστημα Πληρωμών Δαπανών Ηλεκτρονικών Υπηρεσιών.

WiFi V-Timer ΕΚΔΟΣΗ 2Η

Οδηγίες. Εγκατάσταση Προσωπικού Πιστοποιητικού

Βάσεις Δεδομένων 2η εργαστηριακή άσκηση

Εγκατάσταση Joomla 1. Στο Π.Σ.Δ. ( 2. Τοπικά 3. Σε δωρεάν Server

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ

Οδηγός Εγκατάστασης και Χρήσης του Arebas Easy

Κέντρο υποστήριξης HP. Εισαγωγή. Τι χρειάζεται να γνωρίζετε. Λήψη και εγκατάσταση της λύσης Vista στα Windows 8. 1 of 5 1/7/2014 2:09 μμ

ΤΕΙ Πελοποννήσου Τμήμα Πληροφορικής. Οδηγίες Εγκατάστασης VPN Σύνδεσης στο ΤΕΙ Πελοποννήσου

Οδηγίες για smartphone ή tablet με λογισμικό ios

ΕΓΧΕΙΡΙΔΙΟ ΧΡΗΣΗΣ ΚΑΙ ΔΙΑΧΕΙΡΙΣΗΣ ΨΗΦΙΑΚΩΝ ΠΙΣΤΟΠΟΙΗΤΙΚΩΝ

Διαχείριση Επαγγελματιών Εταιρίας

Εγκατάσταση αρχείων βιβλιοθήκης VHOPE και VHOPE

ΟΔΗΓΙΕΣ ΧΡΗΣΗΣ DVR KTEC

PRISMA Win POS Sync Merge Replication

Διαχείριση Έργων Πληροφορικής Εργαστήριο

ΕΓΧΕΙΡΙΔΙΟ ΧΡΗΣΗΣ GRS-1

Οδηγίες εγκατάστασης και χρήσης Java σε προσωπικό υπολογιστή

Βιοϊατρική τεχνολογία

Οδηγός Εισαγωγή Χρηστών σε LDAP Server με χρήση. LdapAdmin TEMPLATE

Σελίδα 1 από 51 ΕΓΧΕΙΡΙΔΙΟ ΧΡΗΣΗΣ ΤΑΥΤΟΤΗΤΑ ΕΓΓΡΑΦΟΥ. Ημερομηνία 10 Φεβρουαρίου 2015 Έκδοση 1.3

ΕΓΧΕΙΡΙΔΙΟ ΧΡΗΣΗΣ ΥΠΟΣΥΣΤΗΜΑΤΟΣ ΑΓΡΟΠΕΡΙΒΑΛΛΟΝΤΙΚΩΝ ΕΝΙΣΧΥΣΕΩΝ. Μέτρο 2.2.1

Δημιουργία ιστοσελίδας με Wordpress - Βασικές λειτουργίες

Management School School Profile Save

Διαδικασία εγκατάστασης και ρύθμισης AUA-VPN για Windows XP/Vista/7/8


Οδηγός χρήσης. EurobankTrader Mobile (για κινητά τηλέφωνα)

4 η Εργαστηριακή Άσκηση

Εγγραφή στο Portal για νέους συνδρομητές

Οδηγός Χρήσης Η-Βιβλίων Ebrary ΒΙΒΛΙΟΘΗΚΗ & ΚΕΝΤΡΟ ΠΛΗΡΟΦΟΡΗΣΗΣ ΠΑΝΕΠΙΣΤΗΜΙΟΥ ΛΕΥΚΩΣΙΑΣ

ΕΓΧΕΙΡΙΔΙΟ ΧΡΗΣΗΣ Π.Σ. ΦΟΙΤΗΤΟΛΟΓΙΟΥ- ΓΙΑ ΤΟ ΔΙΔΑΣΚΟΝΤΑ (ClassWeb)

Υπηρεσία διαμοιρασμού αρχείων

2 η Εργαστηριακή Άσκηση

Ειδικά Θέματα Παραμετροποίησης. Ασφάλεια Εφαρμογής Εναρμόνιση με τον κανονισμό GDRP. Data Communication A.E.

Searching and Downloading OpenStreetMap Data

Management Classes Create Class Create Class Management Classes List of Classes

K9 Γονικός έλεγχος. Εισαγωγή

Εγχειρίδιο Χρήσης Εφαρμογής Συστήματος Διαχείρισης Λογισμικού

ΕΡΓΑΣΤΗΡΙΟ FRONT PAGE 3

Βάσεις δεδομένων (Access)

Οδηγός Χρήσης Η-Βιβλίων EBSCO ΒΙΒΛΙΟΘΗΚΗ & ΚΕΝΤΡΟ ΠΛΗΡΟΦΟΡΗΣΗΣ ΠΑΝΕΠΙΣΤΗΜΙΟΥ ΛΕΥΚΩΣΙΑΣ

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Υπηρεσία Απομακρυσμένης Πρόσβασης VPN Οδηγός Εγκατάστασης και Διαμόρφωσης για χρήστες λειτουργικών συστημάτων MAC OS X

Πίνακας Διαχείρισης Επαφές Παραγγελίες - Προσφορές Τιμολόγια Αποδείξεις Πληρωμές Παραστατικά Αναφορές Εργασίες Καταγραφή εμπορευμάτων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Οδηγίες εγκατάστασης και χρήσης του Quartus

Εγχειρίδιο διαχείρισης χρηστών και λιστών διανομής για τον Υπεύθυνο Φορέα του Δικτύου "Σύζευξις" -1-

Οι νεότερες εξελίξεις στον GM EPC

Οδηγίες ρύθμισης για σύνδεση των μετατροπέων Fronius στο online portal Fronius Solar.web (με χρήση Η/Υ)

Μελίσσια, 16 Ιουνίου Οδηγός Εξαγωγής Συγκεντρωτικών Καταστάσεων ΚΕΠΥΟ από InnovEra

Απλά, γρήγορα, σωστά ΒΑΣΙΚΕΣ Ο ΗΓΙΕΣ ΧΡΗΣΗΣ ΥΠΗΡΕΣΙΩΝ

Οδηγίες Χρήσης EAP Controller Software

Ethniki Cyprus Rate User Manual

Εργαστήριο «Τεχνολογία Πολιτισμικού Λογισμικού» Ενότητα. Επεξεργασία πινάκων

Ολοκληρωμένες Δράσεις προβολής δημοσιότητας για το Δήμο Αρχανών Αστερουσίων Εγχειρίδιο Χρήσης - Παρουσίαση

ΕΓΚΑΤΑΣΤΑΣΗ ΕΦΑΡΜΟΓΩΝ ΓΙΑ TABLET Η SMART PHONES (ANDROID, IOS)

Stellarium Εγχειρίδιο Οδηγιών

Η εφαρμογή είναι βελτιστοποιημένη για όλες τις συσκευές ios και Android, με ios 9.x ή νεότερη έκδοση και Android 4.4 ή νεότερη έκδοση.

CYGWIN Οδηγίες Χρήσης (Συγγραφέας: Γιώργος ούκας)

ΔΙΑΔΙΚΑΣΙA ΜΕΤΑΦΟΡΑΣ ΥΛΙΚΟΥ ΜΑΘΗΜΑΤΟΣ ΑΠΟ BLACKBOARD VISTA ΣΕ OPEN ECLASS

Οδηγίες Εγκατάστασης Pylon Entry

Ενημέρωση σε Windows 8.1 από τα Windows 8

Δραστηριότητα 3: Ρυθμίσεις Oικιακής Ομάδας Τοπικού Δικτύου Η/Υ σε WINDOWS 7 & 8

ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ ΠΡΟΓΡΑΜΜΑ ΜΕΤΑΠΤΥΧΙΑΚΩΝ ΣΠΟΥΔΩΝ

Οδηγίες για τη Χρήση του Google Drive

Διαχείριση Βάσης Δεδομένων (dbadmin)

Διαχείριση Επαγγελματιών Εταιρίας

Transcript:

Κεφάλαιο 1 Στόχος και σκοπός της εργασίας Η ανάγκη υποστήριξης επαγγελματιών αγροτών από σύγχρονα τεχνολογικά μέσα μας οδήγησε στην υλοποίηση αυτής της εφαρμογής. Υπό την επίβλεψη του κ. Θεόδωρου Λάντζου προσπαθήσαμε να δημιουργήσουμε μία εφαρμογή που θα υποστηρίζει αυτές τις σύγχρονες ανάγκες των επαγγελματιών αγροτών. Μπορεί να αποτελέσει μία πολύ έξυπνη λύση για κάθε επαγγελματία αγρότη που σήμερα έχει την ανάγκη υποστήριξης των εργασιών του από την τεχνολογία. Μέχρι τώρα οι αγρότες συνήθιζαν να γράφουν τις εργασίες τους σε τετράδια ή άλλα χαρτιά. Σήμερα οι εργασίες που λαμβάνουν μέρος σε ένα αγρόκτημα είναι αρκετές και σημαντικές. Έτσι, ο κάθε αγρότης δεν μπορεί να θυμάται κάθε φορά τί εργασία έχει επιτελέσει κατά τη διάρκεια της ημέρας. Είναι η ιδανική εφαρμογή για όσους επαγγελματίες αγρότες θέλουν να έχουν μία άμεση, γρήγορη και εύκολη διαχείριση των λογαριασμών και των υπηρεσιών τους. Πρόκειται για ένα λογισμικό τελευταίας τεχνολογίας για κινητή τηλεφωνία, το οποίο έρχεται να οργανώσει και να υποστηρίξει το έργο της αγροτικής παραγωγής. Με την εφαρμογή αυτή κάθε αγρότης που παρέχει υπηρεσίες σε κτήματα άλλων θα μπορεί να έχει ολοκληρωμένη διαχείριση των εργασιών που έγιναν, να βλέπει αυτόματα το μέγεθος της εργασίας, το λογαριασμό των πελατών, να επισκοπεί οπτικά τα χωράφια που εργάστηκε, την ημερομηνία και τις λεπτομέρειες της εργασίας που πραγματοποιήθηκε. Έτσι, για παράδειγμα, κάποιος που παρέχει υπηρεσίες θερισμού καταλήγει συχνά να έχει θερίσει 180 στρμ. και να αμείβεται για 150 στρμ. διότι ο παραγωγός κρύβει έκταση. Ο επαγγελματίας, μην γνωρίζοντας τα χωράφια και μην έχοντας τη δυνατότητα να τα μετρήσει με ακρίβεια, αναγκάζεται να αποδέχεται τα λεγόμενα του παραγωγού και να βγαίνει χαμένος. Με τον επαγγελματία αγρότη όχι μόνο έχουμε αναλυτικά τις εργασίες που έλαβαν μέρος και τη θέση τους στο χάρτη, αλλά ορίζοντας με κλικ στην οθόνη του κινητού τα σύνορα του αγροτεμαχίου βρίσκουμε την έκταση του χωραφιού με απόκλιση 1%- 3% ανάλογα με την ακρίβεια του GPS στο κινητό. Ο χρόνος υπολογισμού της έκτασης του χωραφιού είναι 1,5 λεπτό. Μπορεί να κρατάει δεδομένα εργασιών προς τρίτους. Έτσι, όταν ένας επαγγελματίας σπορέας, θεριστής που εργάζεται σε κτήματα άλλων γεωργών (σε πλήθος 50 και άνω) σε μια εποχή (50 ημερών) μπορεί να καταγράφει απευθείας το είδος της εργασίας και το χωράφι που έλαβε μέρος. Έτσι διαχείριση λογαριασμών και διατήρηση βιβλίων γίνεται παιχνίδι απευθείας από το μηχάνημα επάνω. Η εφαρμογή συντηρεί αρχείο παρελθόντων ετών. 1

Οι κυριότερες υπηρεσίες του Επαγγελματία αγρότη είναι: Παραμετροποίηση σε κάθε είδος παροχής εργασίας. Κοστολόγηση της εργασίας. Πελατολόγιο με πλήρη στοιχεία ακόμη για έκδοση τιμολογίου. Ανάθεση εργασίας σε πελάτη απευθείας πάνω από το χάρτη. Προβολή εργασιών σε κτήματα αγρότη και συνολικών εργασιών Οπτική προβολή των εργασιών που έλαβαν μέρος σε κτήματα τρίτων επάνω στο χάρτη Εμφάνιση και διατήρηση λογαριασμού ανά εργασία και συνολικά Προγραμματισμός εργασιών Παροχή απόδειξης υπηρεσιών Υπολογισμός εμβαδού για καταμέτρηση έκτασης σε οποιοδήποτε σχήμα χωραφιού Διατήρηση αρχείου περασμένων ετών Πλατφόρμα ανάπτυξης εφαρμογής Η εφαρμογή γράφτηκε για συσκευές Android όπου είναι το ποιο γνωστό και ραγδαία εξελίξιμο οικοσύστημα στον κόσμο. Καθημερινά ενεργοποιούνται σχεδόν 1 εκατομμύριο συσκευές Android που το καθιστά το πιο περιζήτητο λειτουργικό στον κόσμο για ανάπτυξη εφαρμογών. Είναι τόσο διαδεδομένο που με τη δημιουργία κάθε νέας εφαρμογής, αυτή γίνεται άμεσα ορατή σε πολλά εκατομμύρια χρήστες και εύκολα διαθέσιμη σε αυτούς. Σήμερα το λογισμικό Android είναι εγκατεστημένο σε πάρα πολλές συσκευές ανεξαρτήτου κόστους. Αυτό είναι που βοηθάει όλους τους χρήστες να αποκτήσουν μία εφαρμογή χωρίς να σπαταλούν υπέρογκα ποσά στην αγορά μίας πολύ ακριβής συσκευής. Καθημερινά γράφονται χιλιάδες εφαρμογές πάνω σε αυτό το λογισμικό που προσφέρουν χαρά και διασκέδαση σε πάρα πολλούς χρήστες, αλλά και γνώσεις σε αυτούς που δεν είναι εξοικειωμένοι με το αντικείμενο. Το τι είναι το Android και με ποιο τρόπο λειτουργεί αναφέρεται λεπτομερώς στην βιβλιογραφία 2,3. 2

Κεφάλαιο 2 Άλλες εργασίες πάνω σε αυτό το αντικείμενο Ο Επαγγελματίας αγρότης αποτελεί καινοτόμα εφαρμογή για τους Έλληνες αγρότες που θέλουν να χρησιμοποιήσουν το κινητό Android τους θέλοντας να έχουν μία άμεση, γρήγορη και εύκολη διαχείριση των λογαριασμών και των υπηρεσιών που προσφέρουν στους πελάτες τους. Δεν έχει βρεθεί κάποια αντίστοιχη εργασία για τέτοιου είδους εφαρμογή που να εξυπηρετεί τις παραπάνω ανάγκες για λογισμικό Android. Τεχνολογικά εργαλεία που χρησιμοποιήθηκαν για τη δημιουργία αυτής της εφαρμογής Τα εργαλεία που θα χρησιμοποιήσουμε. Java JDK (Java Development Kit) Android SDK (Standard Development Kit) Eclipse IDE Οι εφαρμογές android γράφονται σε γλώσσα προγραμματισμού Java, καθώς και το Android SDK είναι γραμμένο σε αυτήν. Μπορείτε να χρησιμοποιήσετε οποιονδήποτε Text Editor για να γράψετε την εφαρμογή σας. Όμως εμείς θα αναφερθούμε στην Eclipse όπου προτείνει και η Google. Χρειάζεται να είναι εγκαταστημένο το περιβάλλον Java JDK (Java Development Kit) όπου περιέχει όλες τις βιβλιοθήκες και τα εργαλεία (Compiler, keytool κτλ.) και μπορείτε να το κατεβάσετε από την ιστοσελίδα της Oracle. Εγκατάσταση του JDK Από την σελίδα της Oracle http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads- 1880260.html Κατεβάζετε το JDK αφού πρώτα επιλέξετε ότι συμφωνείτε με τους όρους χρήσης της Oracle, επιλέξετε το λειτουργικό σύστημα που έχετε και κατεβάστε την αντίστοιχη έκδοση. Βλέπε την παρακάτω εικόνα. 3

Σχέδιο 2.1 (Download center της Oracle για το JDK) Αφού τελειώσετε την εγκατάσταση του JDK πρέπει να εγκαταστήσετε το περιβάλλον του Android (Android SDK). Το Android SDK (Standard Development Kit) είναι όλες οι βιβλιοθήκες καιτα εργαλεία που χρειάζονται (adb, emulator κτλ.) για να δημιουργήσουμε,τρέξουμε, δοκιμάσουμε και εκδώσουμε μια εφαρμογή. Γίνεται λεπτομερής αναφορά για το τι είναι το Android SDK βλέπε βιβλιογραφία 3. Εγκατάσταση του Android SDK. Υπάρχουν δύο τρόποι για την εγκατάσταση του SDK. Ο πρώτος είναι να κατεβάσουμε έτοιμο το bundle του SDK μαζί με τον Java Editor της Eclipse IDE από την ιστοσελίδα του Android. http://developer.android.com/sdk/index.html Πατάμε στο Download the SDK (βλέπε εικόνα 2.2) και αφού συμφωνήσετε με τους όρους της Google και επιλέξετε την έκδοση Windows που έχετε θα κατεβάσετε ένα zip αρχείο που θα περιέχει το SDK και το Eclipse IDE. 4

Εικόνα 2.2 (Σελίδα που κατεβάζετε το Android SDK μαζί με το Eclipse IDE) Ο δεύτερος τρόπος είναι αν έχετε ήδη εγκαταστημένο το Eclipse IDE να περάσετε το ADT (Android Development tool) plugin ώστε να μπορείτε να κατεβάσετε το Android SDK και να το εγκαταστήσετε στην Eclipse. 1) Ξεκινήστε την Eclipse και πηγαίνετε Help->Install New Software 2) Πατήστε ADD στο δεξί πάνω μέρος της οθόνης 3) Στο Add repository παράθυρο βάλτε στο Name Android ADT και στο Location τον παρακάτω σύνδεσμο. https://dl-ssl.google.com/android/eclipse/ Εικόνα 2.3 (Εγκατάσταση του ADT στην Eclipse) 4) Πατάμε οκ και περιμένουμε να εμφανιστή μία λίστα με τα Development Tools 5

Εικόνα 2.4 (Εγκατάσταση των Development tools) 5) Τα επιλέγουμε και πατάμε επόμενο 6) Περιμένουμε να γίνει η εγκατάσταση και αφού τελειώσει θα μας ζητήσει να κάνει επανεκκίνηση η Eclipse Μόλις εγκατασταθεί ανοίγουμε το eclipse και πηγαίνουμε στο window Android Sdk Manager. Εκεί ανοίγει ένα παράθυρο παρόμοιο με την παρακάτω εικόνα. Εικόνα 2.5 (Android SDK Manager) Από εδώ επιλέγουμε ποια έκδοση του android θέλουμε να κατεβάσουμε για να αναπτύξουμε την εφαρμογή μας. ΠΡΟΣΟΧΗ: Κάθε έκδοση είναι παρόμοια με την προηγούμενη, με προσθετά χαρακτηριστικά και βελτιώσεις, οπότε προσοχή με ποια θα ξεκινήσετε. Εκτός από την έκδοση του Android που θέλουμε επιλέγουμε για 6

εγκατάσταση τον φάκελο Tools και Extras. Αφού επιλέξουμε όλα αυτά που θέλουμε πατάμε Install x packages, κάνουμε αποδοχή των αδειών χρήσης και περιμένουμε να τελειώσει η εγκατάσταση τους. Η εφαρμογή Farm Contractor έχει αναπτυχθεί για Android 4.1.2 και πάνω οπότε το ελάχιστο που πρέπει να έχουμε είναι η έκδοση 4.1.2. Ο χρόνος εγκατάστασης διαφέρει ανάλογα με το πόσα πακέτα έχουμε επιλέξει να εγκατασταθούν και τον φόρτο του server εκείνη την ώρα. Αφού τελειώσει η εγκατάσταση κλείνουμε τον SDK Manager και κάνουμε επανεκκίνηση το Eclipse. Δημιουργία Virtual Machine Η εικονική μηχανή είναι απαραίτητη, εάν δεν διαθέτουμε κάποια συσκευή με λειτουργικό Android, ώστε να μπορούμε να τρέχουμε και να δοκιμάζουμε την εφαρμογή μας. Για να δημιουργήσουμε μια νέα εικονική μηχανή ανοίγουμε το Eclipse και πηγαίνουμε στο window Android Virtual Device Manager. Στο παράθυρο που ανοίγει εμφανίζονται όλες οι εικονικές συσκευές που έχουμε δημιουργήσει. Για να δημιουργήσουμε μια καινούργια επιλέγουμε New. Στο παράθυρο που ανοίγει συμπληρώνουμε το όνομα της εικονικής μηχανής που θέλουμε, το μέγεθος οθόνης που θέλουμε να έχει, την έκδοση Android που θέλουμε ( αν θέλουμε να χρησιμοποιήσουμε τους χάρτες της Google τότε πρέπει στο target να επιλέξουμε την έκδοση Android που περιέχει το Google Api). Επίσης επιλέγουμε τον τύπο του επεξεργαστή και συμπληρώνουμε τα υπόλοιπα πεδία ανάλογα με τις ανάγκες μας. Μόλις τελειώσουμε πατάμε ΟΚ και η εικονική μηχανή έχει δημιουργηθεί και είναι έτοιμη για να την ανοίξουμε. Εκτέλεση εικονικής μηχανής (Virtual Machine) Για να ανοίξουμε μια εικονική μηχανή ώστε να τρέξουμε μια εφαρμογή που έχουμε κάνει πηγαίνουμε πάλι στο Android Virtual Device Manager, επιλέγουμε την εικονική μηχανή που θέλουμε και πατάμε Start. Περιμένουμε λίγο μέχρι να φορτώσει η εικονική μηχανή και είμαστε έτοιμοι. Πλέον έχουμε ένα εργαλείο που μοιάζει με μια συσκευή Android και μπορούμε να τρέχουμε τις εφαρμογές μας. 7

Εικόνα 2.6 (Virtual Machine που προσομοιώνει ένα κινητό με έκδοση 2.2) Δημιουργία νέου Android Project στο Eclipse Εφόσον έχουμε κάνει όλα τα παραπάνω επιτυχώς είμαστε έτοιμοι για να ξεκινήσουμε την ανάπτυξη εφαρμογών. Αρχικά πηγαίνουμε στο File New Other. Στο παραθυράκι που ανοίγει κάνουμε διπλό κλικ στο Android για να ανοίξει η λίστα και επιλέγουμε το Android Application Project. Εκεί ανοίγει ένα νέο παράθυρο στο οποίο θα χρειαστεί να συμπληρώσουμε κάποια στοιχεία για την εφαρμογή μας. Συμπληρώνουμε όνομα εφαρμογής, όνομα project και όνομα πακέτου. Το όνομα πακέτου θα πρέπει να είναι κάτι μοναδικό διότι 2 εφαρμογές δεν μπορούν να χρησιμοποιούν το ίδιο πακέτο. Επίσης συμπληρώνουμε την χαμηλότερη έκδοση Android την οποία θα υποστηρίζει η εφαρμογή μας, την έκδοση Android στην οποία θα την αναπτύξουμε και θα την κάνουμε compile και το θέμα που θα χρησιμοποιήσουμε. Αφού συμπληρώσουμε όλα αυτά πατάμε Next, εκεί επιλέγουμε αν θέλουμε κάτι και πατάμε ξανά Next. Στο επόμενο παράθυρο μπορούμε να ρυθμίσουμε το εικονίδιο της εφαρμογής. Πατάμε Next και στη συνέχεια επιλέγουμε τι τύπου activity θέλουμε να είναι αυτή που θα φτιάξει το eclipse αρχικά. Πατάμε Next, δηλώνουμε το όνομα της κλάσης Activity και τέλος πατάμε Finish και περιμένουμε το eclipse να δημιουργήσει τον φάκελο του project με όλα τα απαραίτητα στοιχεία μέσα. 8

Εικόνα 2.6 (Νέο android project wizard) Εισαγωγή ενός έτοιμου project στο Eclipse Εάν έχουμε ένα έτοιμο project και θέλουμε να το δοκιμάσουμε ή να δούμε τον κώδικά του, ανοίγουμε το eclipse και πηγαίνουμε File import. Στο παραθυράκι που ανοίγει επιλέγουμε General Existing projects into workspace. Εκεί βρίσκουμε το project που θέλουμε και το επιλέγουμε. Επίσης αν θέλουμε επιλέγουμε το copy project into workspace αν θέλουμε το project να αντιγραφεί στον φάκελο του eclipse. Πατάμε finish και το project είναι έτοιμο στο eclipse. Για να το τρέξουμε, αν έχουμε κάποια συμβατή συσκευή Android τη συνδέουμε στον υπολογιστή και πατάμε run στον eclipse. Αλλιώς ανοίγουμε έναν emulator από το eclipse και μόλις ανοίξει πατάμε run και περιμένουμε να φορτώσει. Δημιουργία εκτελέσιμου αρχείου.apk Αφού έχουμε την εφαρμογή μας έτοιμη και θέλουμε να την δώσουμε και σε άλλους χρήστες να την δοκιμάσουν θα πρέπει να δημιουργήσουμε ένα εκτελέσιμο αρχείο κατάληξης.apk. Τα αρχεία αυτά υποστηρίζονται από το Android και είναι ο τύπος των εφαρμογών που μπορούν να τρέξουν στις συσκευές Android. Για να γίνει αυτό, από το μενού του eclipse πηγαίνουμε στο File Export. Επιλέγουμε Android Export Android Application. Στη συνέχεια επιλέγουμε το project που θέλουμε και πατάμε next. Στο επόμενο παραθυράκι μας ζητάει το keystore που θα χρησιμοποιήσουμε. Το keystore είναι στην ουσία η υπογραφή μας για την εφαρμογή και ταυτόχρονα ένα 9

είδος ασφάλειας. Εάν δεν έχουμε κάποιο έτοιμο επιλέγουμε create new και επιλέγουμε τον φάκελο αποθήκευσης που θέλουμε. Συμπληρώνουμε έναν κωδικό της επιλογής μας και πατάμε next. Στο επόμενο παραθυράκι συμπληρώνουμε τα στοιχεία μας. Στο πεδίο validity(years) πρέπει να βάλουμε μια τιμή μεγαλύτερη από 25. Στη συνέχεια επιλέγουμε την τοποθεσία και το όνομα του αρχείου.apk και πατάμε finish. Το αρχείο.apk της εφαρμογής μας είναι έτοιμο και μπορούμε να δοκιμάσουμε και σε άλλες συσκευές με λειτουργικό Android. Κεφάλαιο 3 Η σχεδίαση της εφαρμογής Η εφαρμογή σχεδιάστηκε έτσι ώστε να εξυπηρετεί τις εκδόσεις από 2.2 μέχρι 4.4 (τελευταία έκδοση) του Android χρησιμοποιώντας όλα τα χαρακτηριστικά της κάθε έκδοσης. Με τη βοήθεια της βιβλιοθήκης συμβατότητας της Google καταφέραμε να εντάξουμε πολλά από τα components που περιέχονται σε νεότερες εκδόσεις στην έκδοση 2.2 του Android. Συνολικά ο Επαγγελματίας Αγρότης αποτελείται από 43 κλάσεις εκ των οποίων 27 είναι γραφικές (activities και fragments). Τα 3 κύρια χαρακτηριστικά της εφαρμογής είναι: 1. Τα frgments που χρησιμοποιήσαμε για να σχεδιάσουμε το UI 2. Η συμβατότητα και η χρήση του ActionBar ανάλογα με την έκδοση του Android. 3. Η σχεδίαση της βάσης καθώς ο FarmContractor είναι ένα πρόγραμμα διεπαφής ανάμεσα στο χρήστη και σε μία βάση δεδομένων. 10

Δεν θα αναφερθούμε στα κοινά components που χρησιμοποιεί αυτή η εφαρμογή καθώς έχει γίνει λεπτομερής αναφορά στην βιβλιογραφία 3 Αυτό που χαρακτηρίζει την σχεδίαση της εφαρμογής είναι η χρήση των fragments που παρουσιάστηκαν για πρώτη φορά στην έκδοση 3.0 του Android. Τι είναι το fragment; Ένα fragment αντιπροσωπεύει μια συμπεριφορά ή ένα τμήμα της διεπαφής χρήστη σε μια δραστηριότητα. Μπορούμε να συνδυάσουμε πολλά fragments σε μια ενιαία δραστηριότητα (activity) για την κατασκευή ενός UI πολυ-παραθύρων και να ξαναχρησιμοποιήσουμε ένα fragment σε πολλαπλές δραστηριότητες (activities). Μπορούμε να σκεφτούμε ένα fragment ως ένα αρθρωτό τμήμα μιας δραστηριότητας, η οποία έχει το δικό του κύκλο ζωής, λαμβάνει τις δικά του γεγονότα εισόδου, και το οποίο μπορείτε να προσθέσετε ή να αφαιρέσετε, ενώ η δραστηριότητα εκτελείται (περίπου όπως ένα «υπό activity» που μπορείτε να επαναχρησιμοποιήσετε σε διάφορα activities). Παράδειγμα χρήσης fragments. Όταν τρέξει για πρώτη φόρα η εφαρμογή θα εμφανιστεί η διεπαφή χρήστη όπου θα γίνουν οι κατάλληλες παραμετροποιήσεις από τον χρήστη. Αυτή η διεπαφή (Activity) χρησιμοποιεί πολλαπλά fragments. Fragment Καλωσορίσματος Fragment Επιλογής Καλλιεργητικού έτους Fragment Εισαγωγής στοιχείων του χρήστη Εικόνα 3.1 (Διεπαφή πρώτης εκτέλεσης της εφαρμογής) Η οθόνη αυτή [Εικόνα 3.1] εμφανίζεται μόνο την πρώτη φορά που τρέχει η εφαρμογή μετά την εγκατάσταση. Εδώ χρειάζεται να ορίσει το τρέχων καλλιεργητικό έτος και να συμπληρώσει τα στοιχεία του ο χρήστης. Όπως αναφέραμε και παραπάνω η εφαρμογή μας χρησιμοποιεί fragments για την δημιουργία ενός UI πολύ-παραθύρου. Στο παραπάνω σχήμα φαίνονται 3 οθόνες όπου η κάθε μια είναι ένα ξεχωριστό fragment και διαχειρίζονται από ένα activity. 11

Δομή χρήσης Activity και fragments Activity Παραμετροποίησης της εφαρμογής όταν εκτετελείται για πρώτη φορά Κλαση ειδικου προσαρμογεα οπου αποθηκευει πληροφοριες απο τα fragment <<Activity>> ActivitySetuUpContractor SectionsPageAdapter <<fragment>> FragmentWelcome <<fragment>> FragmentSetUpNotifications <<Interface>> FragmentCreateContractor Fragment που περιέχει το μηνύμα του καλωσορίσματος Fragment που περιέχει την επιλογή καλλιεργητικού έτους και ειδοποιήσεων Fragment όπου ο χρήστης περνάει τα στοιχεία του Κάθε fragment που θέλουμε να περιέχει το Activity αποθηκεύονται οι πληροφορίες του σε ένα αντικείμενο τύπου SectionPageAdapter και επαναφέρονται απο αυτό κάθε φορά που ο χρήστης επιλέγει ένα fragment Εικόνα 3.2 (Διάγραμμα προβολής χρήσης fragment από Activity) Παράδειγμα του Activity SetUpContractor Ο κώδικας σε Java // Η κλάση του Activity μας κληρονομεί το FragmentActivity που βρίσκεται στην βοηθητική κλάση της Google όπου μας επιτρέπει να χρησιμοποιούμε τα fragments μέχρι την έκδοση 2.1 public class ActivitySetUpContractor extends FragmentActivity private SectionsPagerAdapter msectionspageradapter; private ViewPager mviewpager; @Override protected void oncreate(bundle savedinstancestate) // TODO Auto generated method stub super.oncreate(savedinstancestate); setcontentview(r.layout.activity_setup_contractor); final ImageView btnnextfragment=(imageview)findviewbyid(r.id.btnnextwelcomefragment; final CustomTextView tvwelcomenextview=(customtextview)findviewbyid(r.id.tvwelcomemessage); // Set up the ViewPager with the sections adapter. mviewpager = (ViewPager) findviewbyid(r.id.pager); // Create the adapter that will return a fragment for each sections // of the app. msectionspageradapter = new SectionsPagerAdapter(getSupportFragmentManager(),this,mViewPager); mviewpager.setadapter(msectionspageradapter); 12

// Προσθήκη των fragments στο activity μας. msectionspageradapter.addfragment(fragmentwelcome.class, null, gettext(r.string.welcome).tostring()); msectionspageradapter.addfragment(fragmentsetupnotification.class, null, gettext(r.string.notifications_and_farm_year).tostring()); msectionspageradapter.addfragment(fragmentcreatecontractor.class, null, gettext(r.string.enter_your_information).tostring()); Ο κώδικας του layout σε XML activity_setup_contractor.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/background" > <android.support.v4.view.viewpager xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="100dp" android:layout_alignparentbottom="true" android:layout_below="@+id/tvworkprofit" tools:context=".activitysetupcontractor" > <! This title strip will display the currently visible page title, as well as the page titles for adjacent pages. > <android.support.v4.view.pagertitlestrip android:id="@+id/pager_title_strip" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" android:paddingbottom="4dp" android:paddingtop="4dp" android:textcolor="#fff" android:visibility="gone" /> </android.support.v4.view.viewpager> <ImageView android:id="@+id/btnnextwelcomefragment" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentbottom="true" android:layout_alignparentright="true" android:src="@drawable/next_button" /> <com.despkyri.farmcontractor.customtextview android:id="@+id/tvwelcomemessage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentbottom="true" android:layout_marginbottom="18dp" android:layout_toleftof="@+id/btnnextwelcomefragment" android:text="@string/lets_start" android:textappearance="?android:attr/textappearancemedium" android:textcolor="#90000000" /> <com.despkyri.farmcontractor.customtextview android:id="@+id/tvworkprofit" android:layout_width="210dp" android:layout_height="wrap_content" android:layout_alignparentright="true" android:layout_alignparenttop="true" android:layout_marginright="15dp" android:layout_margintop="12dp" 13

android:gravity="center" android:text="@string/app_name" android:textcolor="#90000000" android:textsize="30sp" /> </RelativeLayout> Παράδειγμα του fragment SetUpNotifications Ο κώδικας σε Java // Η κλάση του fragment μας κληρονομεί το Fragment που βρίσκεται στην βοηθητική κλάση της Google όπου μας επιτρέπει να χρησιμοποιούμε τα fragments μέχρι την έκδοση 2.1 public class FragmentSetupNotification extends Fragment private View mview; // Είναι το view του fragment private ContentSettings settings; private int spinnermotionid; @Override public void oncreate(bundle savedinstancestate) // TODO Auto generated method stub super.oncreate(savedinstancestate); spinnermotionid= 1; @Override public View oncreateview(layoutinflater inflater, ViewGroup container, Bundle savedinstancestate) final DataHelperSettings datasettings=new DataHelperSettings(getActivity()); settings = datasettings.readsettings(); //Το View του fragment ποιο layout προβάλει mview=inflater.inflate(r.layout.fragment_set_notification, container,false); Spinner spinners=(spinner)mview.findviewbyid(r.id.spinneryears); int pos=settings.getfarmingyear() 2013; if(pos>=0) spinners.setselection(pos); spinners.setontouchlistener(new OnTouchListener() @Override public boolean ontouch(view arg0, MotionEvent arg1) spinnermotionid = arg1.getaction(); return false; ); spinners.setonitemselectedlistener(new OnItemSelectedListener() @Override public void onitemselected(adapterview<?> adapter, View arg1, int position, long arg3) try String name=(string)adapter.getitematposition(position); DataHelperContractor contractor=new DataHelperContractor(getActivity()); if(contractor.hascontractor()) if(spinnermotionid == MotionEvent.ACTION_UP) changefarmyear(integer.parseint(name)); spinnermotionid= 1; 14

else settings.setfarmingyear(integer.parseint(name)); datasettings.savesettings(settings); spinnermotionid= 1; catch(numberformatexception e) spinnermotionid= 1; ); @Override public void onnothingselected(adapterview<?> arg0) spinnermotionid= 1; final TimePicker timepicker = (TimePicker)mView.findViewById(R.id.timePickerNotify); timepicker.setcurrenthour(settings.gethours()); timepicker.setcurrentminute(settings.getminutes()); final CheckBox cb=(checkbox)mview.findviewbyid(r.id.cbenablenotifications); cb.setchecked(settings.isnotify()); cb.setoncheckedchangelistener(new OnCheckedChangeListener() ); @Override public void oncheckedchanged(compoundbutton arg0, boolean checked) if(checked) settings.sethours(timepicker.getcurrenthour()); settings.setminutes(timepicker.getcurrentminute()); settings.setnotify(checked); datasettings.savesettings(settings); enablenotifications(); timepicker.setontimechangedlistener(new OnTimeChangedListener() ); @Override public void ontimechanged(timepicker arg0, int arg1, int arg2) settings.setnotify(false); cb.setchecked(false); enablenotifications(); return mview; public void changefarmyear(int newyear) IODatabase iodatabase=new IODatabase(getActivity()); if(iodatabase.backupfileexist(newyear)) confirmrestoreyear(newyear); else 15

confirmchangeyear(newyear); public void confirmrestoreyear(final int newyear) AlertDialog.Builder builder=new AlertDialog.Builder(getActivity()); builder.seticon(r.drawable.ic_action_device_access_storage_1); builder.settitle(r.string.restore_farm_year); builder.setmessage(r.string.restore_farm_year_message); builder.setpositivebutton(r.string.restore_alternative,new DialogInterface.OnClickListener() @Override public void onclick(dialoginterface dialog, int which) IODatabase iodatabase=new IODatabase(getActivity()); iodatabase.backupdatabase(settings.getfarmingyear()); if(iodatabase.backupdatabase(settings.getfarmingyear())) iodatabase.restoredatabase(newyear); Toast.makeText(getActivity(), R.string.restored_successfully_database, Toast.LENGTH_SHORT).show(); dialog.dismiss(); getactivity().finish(); ); builder.setnegativebutton(r.string.cancel,new DialogInterface.OnClickListener() @Override public void onclick(dialoginterface dialog, int which) Spinner spinners=(spinner)mview.findviewbyid(r.id.spinneryears); int pos=settings.getfarmingyear() 2013; if(pos>=0) spinners.setselection(pos); dialog.dismiss(); ); builder.setoncancellistener(new OnCancelListener() @Override public void oncancel(dialoginterface arg0) Spinner spinners=(spinner)mview.findviewbyid(r.id.spinneryears); int pos=settings.getfarmingyear() 2013; if(pos>=0) spinners.setselection(pos); ); AlertDialog dialog=builder.create(); dialog.show(); public void confirmchangeyear(final int newyear) AlertDialog.Builder builder=new AlertDialog.Builder(getActivity()); builder.seticon(r.drawable.ic_action_device_access_storage_1); builder.settitle(r.string.farm_year); builder.setmessage(r.string.create_new_year); builder.setpositivebutton(r.string.create,new DialogInterface.OnClickListener() @Override public void onclick(dialoginterface dialog, int which) IODatabase io=new IODatabase(getActivity()); if(io.backupdatabase(settings.getfarmingyear())) 16

DataHelperSettings(getActivity()); OpenHelperDatabase(getActivity()); settings.setfarmingyear(newyear); DataHelperSettings datasettings=new datasettings.savesettings(settings); OpenHelperDatabase db=new db.wipedatabase(); dialog.dismiss(); getactivity().finish(); ); builder.setoncancellistener(new OnCancelListener() @Override public void oncancel(dialoginterface arg0) Spinner spinners=(spinner)mview.findviewbyid(r.id.spinneryears); int pos=settings.getfarmingyear() 2013; if(pos>=0) spinners.setselection(pos); ); builder.setnegativebutton(r.string.cancel,new DialogInterface.OnClickListener() @Override public void onclick(dialoginterface dialog, int which) Spinner spinners=(spinner)mview.findviewbyid(r.id.spinneryears); int pos=settings.getfarmingyear() 2013; if(pos>=0) spinners.setselection(pos); dialog.dismiss(); ); AlertDialog dialog=builder.create(); dialog.show(); public void enablenotifications() Intent intent = new Intent(getActivity(), NotificationService.class); PendingIntent pintent = PendingIntent.getService(getActivity(), 0, intent, 0); AlarmManager alarm = (AlarmManager)getActivity().getSystemService(Context.ALARM_SERVICE); if(settings.isnotify()) Calendar cal = Calendar.getInstance(); cal.set(calendar.hour_of_day, settings.gethours()); cal.set(calendar.minute, settings.getminutes()); cal.set(calendar.second, 00); alarm.setrepeating(alarmmanager.rtc_wakeup, cal.gettimeinmillis(),24*60*60*1000, pintent); else alarm.cancel(pintent); 17

Ο κώδικας του layout σε XML fragment_set_notifications.xml <?xml version="1.0" encoding="utf 8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/scrollview1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/white_transp" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <com.despkyri.farmcontractor.customtextview android:id="@+id/customtextview1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginleft="10dp" android:layout_margintop="10dp" android:text="@string/choose_year" android:textcolor="@color/black" android:textsize="18sp" /> <Spinner android:id="@+id/spinneryears" android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1" android:entries="@array/years" android:prompt="@string/choose_year" /> <CheckBox android:id="@+id/cbenablenotifications" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_margintop="10dp" android:text="@string/enable_notifications" android:textcolor="@color/black" android:textsize="20sp" /> <TimePicker android:id="@+id/timepickernotify" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:scrollbarstyle="insideinset" /> </LinearLayout> </ScrollView> ActionBar Ένα χαρακτηριστικό που χρησιμοποιεί η εφαρμογή για εκδόσεις λογισμικού πάνω από 3.0 είναι το ActionBar. Τι είναι το ActionBar; 18

Το ActionBar είναι ένα χαρακτηριστικό παράθυρο που προσδιορίζει τη θέση του χρήστη, και του παρέχει ενέργειες και τρόπους πλοήγησης. Το ActionBar προσφέρει στους χρήστες ένα οικείο περιβάλλον σε όλες τις εφαρμογές που το σύστημα προσαρμόζεται ανάλογα με τις διαφορετικές διαμορφώσεις της οθόνης. Εικόνα 3.3 (Η μπάρα ActionBar) Το ActionBar παρέχει αρκετές βασικές λειτουργίες: Παρέχει ένα ειδικό χώρο για να δώσει στην εφαρμογή μια ταυτότητα και υποδείξει τη θέση του χρήστη στην εφαρμογή. Κάνει σημαντικές ενέργειες εμφανέστατες και προσβάσιμες με ένα προβλέψιμο τρόπο (όπως Αναζήτηση). Υποστηρίζει την πλοήγηση και προβάλλει τις μεταγωγές μέσα στις εφαρμογές (με καρτέλες ή drop-down λίστες). Το ActionBar το χρησιμοποιούμε σαν μενού για να προβάλλουμε τις σημαντικές ενέργειες που κάνει ο χρήστης όπως για παράδειγμα προσθήκη, διαγραφή, αναζήτηση κτλ. Μέχρι τη στιγμή που ολοκληρώθηκε η εφαρμογή το ActionBar δεν υποστηρίζονταν από τη βιβλιοθήκη συμβατότητας της Google. Γι αυτό έπρεπε να βρούμε έναν άλλο τρόπο για να προβάλλουμε τις ενέργειες του χρήστη (Μενού), όπου αυτά αποτελούνταν από buttons και dialogs. Πρόσφατα η Google κυκλοφόρησε μία νέα αναβάθμιση της βιβλιοθήκης συμβατότητας όπου μας επιτρέπει να χρησιμοποιούμε το ActionBar μέχρι την έκδοση 2.1. Παρόλα αυτά εμείς χρησιμοποιούμε την παραπάνω λύση που αναφέρθηκε. Ο κώδικας που μας επιτρέπει να βλέπουμε ποια έκδοση τρέχει η εφαρμογή μας και να προσαρμόζεται το UI ανάλογα με την έκδοση: 19

android.os.build.version.sdk_int όπου SDK_INT είναι η έκδοση του Android. Όταν δημιουργούμε ένα μενού αυτόματα μπορούμε να εμφανίσουμε τις επιλογές του στο ActionBar αν επιλέξουμε SHOW_AS_ACTION android:showasaction="ifroom withtext Παράδειγμα ενός μενού: <?xml version="1.0" encoding="utf 8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/menu_map_options" android:showasaction="ifroom withtext" android:title="@string/action_settings"> <menu> <item android:id="@+id/menu_map_satellite" android:title="@string/satellite" android:showasaction="ifroom withtext" android:checkable="true" android:orderincategory="0"/> </menu> </item> </menu> SQLite βάση δεδομένων Η SQLite βάση δεδομένων είναι αυτή που υποστηρίζει το Android για αποθήκευση δεδομένων. Είναι μια lite μορφή της SQL πράγμα που την κάνει ιδανική για χρήση σε φορητές συσκευές. Για τη χρησιμοποίησή της σε κάποια εφαρμογή δεν απαιτείται να κατεβάσουμε κάτι. Απλά την δημιουργούμε και την διαχειριζόμαστε κατευθείαν με κώδικα, καθώς υπάρχει ενσωματωμένη στις βιβλιοθήκες του Android. 20

Εικόνα 3.4 (Διάγραμμα E-R της βάσης του Farm Contractor) SQLiteOpenHelper DataHelperContractor openhelper:openhelperdatabase + data helper functions Content Contractor + content functions DataHelperCustomer openhelper:openhelperdatabase + data helper functions Content Customer checked:boolean + content functions OpenHelperDatabase DataHelperWork openhelper:openhelperdatabase + data helper functions DataHelperContract ContentWork + content functions ContentContract Content Person id:integer name:string lastname:string address:string phone:string vat:string + content functions name:string version:integer + open helper fuctions openhelper:openhelperdatabase + data helper functions + content functions ContentReportContract DataHelperSettings + content functions openhelper:openhelperdatabase + data helper functions ContentSettings + content functions Εικόνα 3.4 (Διάγραμμα κλάσεων που δείχνει την δομή της βάσης του Farm Contractor) Παράδειγμα των κλάσεων που χρησιμοποιούνται για την προσπέλαση των δεδομένων ενός πίνακα της βάσης. OpenHelperDatabase Είναι η κλάση όπου δημιουργεί, αναβαθμίζει και επιστρέφει σύνδεση με βάση. Ο κώδικας. /** * Δημιουργει και επιστρεφει συνδεση με την βαση * @author <b>despotis/kyriazopoulos</b> * */ public class OpenHelperDatabase extends SQLiteOpenHelper private static String name="farmcontractor.db"; //The name of database private static int version=1; //Version of database //Constructor public OpenHelperDatabase(Context context) super(context, name, null, version); // TODO Auto generated constructor stub @Override public void oncreate(sqlitedatabase db) //Run create database queries //db.g //this.getwritabledatabase(). createdatabase(db); 21

@Override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) //onupgrage triggers when the version of database change /** * Περιεχει ολα τα ερωτηματα που δημιουργουν τους πινακες * @param db */ public void createdatabase(sqlitedatabase db) try String query="create table CUSTOMERS (ID integer primary key autoincrement,name COLLATE NOCASE,LASTNAME COLLATE NOCASE,ADDRESS COLLATE NOCASE, PHONE COLLATE NOCASE,VAT COLLATE NOCASE)"; db.execsql(query); query="create table CONTRACTOR (ID integer primary key autoincrement,name COLLATE NOCASE,LASTNAME COLLATE NOCASE,ADDRESS COLLATE NOCASE, PHONE COLLATE NOCASE,VAT COLLATE NOCASE)"; db.execsql(query); query="create table WORKS (ID integer primary key autoincrement,name COLLATE NOCASE,NOTE COLLATE NOCASE,COST real,profit real,vat real)"; db.execsql(query); query="create table CONTRACT (ID integer primary key autoincrement,customer_id integer,work_id integer,note COLLATE NOCASE,WORK_PRICE real,field_area real,discount real,completed integer,notify_me integer,year integer,month integer,day integer,latitude real,longitude real)"; db.execsql(query); query="create table SETTINGS (ID integer primary key,notify integer,hours integer,minutes integer,map_type integer,farm_year integer)"; db.execsql(query); query="insert into SETTINGS (ID,NOTIFY,HOURS,MINUTES,MAP_TYPE,FARM_YEAR) VALUES(0,0,8,0,4,2013)"; db.execsql(query); catch(sqliteexception e) Log.e("DatabaseOpenHelper::createDatabase", e.getmessage()); public void wipedatabase() SQLiteDatabase db=this.getwritabledatabase(); String query="delete from customers"; db.execsql(query); query="delete from works"; db.execsql(query); query="delete from contract"; db.execsql(query); db.close(); Για κάθε πίνακα που περιέχει η βάση δημιουργούμε και μια αντίστοιχη κλάση για την προσθήκη, εξαγωγή, αναβάθμιση και διαγραφή των δεδομένων του πίνακα. Τα δεδομένα επιστρέφονται σε ένα Content Provider για κάθε γραμμή του πίνακα. Όταν 22

θέλουμε να επιστρέψουμε αρκετές γραμμές του πίνακα επιστρέφουμε μια λίστα από Contents για κάθε πίνακα. Κλάση ContentContractor /** * Περιεχει ολες τις πληροφοριες ενος "συμβολαιου" * @author Panos * */ public class ContentContract private int id; // Ο μοναδικος κωδικος του private int customerid; //Ο κωδικος πελατη private int workid; //Ο κωδικος εργασιας private String note; //Σημειωση private double workprice; //Τιμη ανα μονοδα εκτασης χωραφιου private double fieldarea;//εκταση χωραφιου private double discountpercent; //Εκπτωση συμβολαιου private boolean completed; //Ολοκληρωμενο private boolean notify; //Ειδοποιηση private LatLng point;//σημειο χωραφιου στον χαρτη private int year; //Χρονος private int month; //Μηνας private int day;//μερα συμβολαιου public ContentContract() id= 1; customerid= 1; workid= 1; workprice=0; fieldarea=0; discountpercent=0; year=0; day=0; month=0; note=""; completed=true; notify=false; point=new LatLng(0,0); /** * Καθαρισμος συμβολαιου */ public void clear() id= 1; customerid= 1; workid= 1; workprice=0; fieldarea=0; discountpercent=0; year=0; day=0; month=0; note=""; completed=true; notify=false; point=new LatLng(0,0); public int getid() return id; public void setid(int id) this.id = id; public int getcustomerid() return customerid; public void setcustomerid(int customerid) this.customerid = customerid; public int getworkid() 23

return workid; public void setworkid(int workid) this.workid = workid; public double getfieldarea() return fieldarea; public void setfieldarea(double fieldarea) this.fieldarea = fieldarea; public void setfieldarea(string fieldarea) try this.fieldarea = Double.parseDouble(fieldArea); catch(numberformatexception e) this.fieldarea = 0; public double getdiscountpercent() return discountpercent; public void setdiscountpercent(double discountpercent) this.discountpercent = discountpercent; public void setdiscountpercent(string discountpercent) try this.discountpercent = Double.parseDouble(discountPercent); catch(numberformatexception e) this.discountpercent=0; public boolean iscompleted() return completed; public int getcompleted() return completed?1:0; public void setcompleted(boolean completed) this.completed = completed; public boolean isnotify() return notify; public int getnotify() return notify?1:0; public void setnotify(boolean notify) this.notify = notify; public LatLng getpoint() return point; public void setpoint(latlng point) this.point = point; public void setpoint(double latitude,double longidute) this.point=new LatLng(latitude,longidute); public double getpricewithoutdiscount() return Math.round(((fieldArea*workPrice*100.00)/100)*100.0)/100.00; public String getpricewithoutdiscounttostring() try 24

return Double.toString(getPriceWithoutDiscount())+" "; catch (NumberFormatException e) return "0 "; public double getpricewithdiscount() double temp=getpricewithoutdiscount(); temp =((getpricewithoutdiscount()*discountpercent)/100); temp=math.round(temp*100.00)/100.00; if(temp<0) temp=0; return temp; public String getpricewithdiscounttostring() try return Double.toString(getPriceWithDiscount())+" "; catch (NumberFormatException e) return "0 "; public double getworkprice() return workprice; public void setworkprice(double workprice) this.workprice = workprice; public void setworkprice(string workprice) try this.workprice=double.parsedouble(workprice); catch(numberformatexception e) this.workprice=0; public int getyear() return year; public void setyear(int year) this.year = year; public int getmonth() return month; public void setmonth(int month) this.month = month; public int getday() return day; public void setday(int day) this.day = day; public String getnote() return note; public void setnote(string note) this.note = note; 25

Κλάση DataHelperContractor περιέχει όλες τις συναρτήσεις για το διάβασμα, ενημέρωση, διαγραφή και δημιουργία τιμών για τον πίνακα Contractor public class DataHelperContractor private OpenHelperDatabase openhelper; public DataHelperContractor(Context context) openhelper=new OpenHelperDatabase (context); /** * Διαγραφη τον πελατη με το id πελατη που περνει σαν εισοδο * @param customid */ public void deletecontractor(int contractorid) try String query="delete from CONTRACTOR where id="+contractorid; SQLiteDatabase db=openhelper.getwritabledatabase(); db.execsql(query); db.close(); catch(sqliteexception e) Log.e("ContractorDataHelper::deleteContractor", e.getmessage()); /** * Dimiourgi ena pelati * @param customer dedomena pelati * @return true an dimiourgithike false an den dimiourgio */ public boolean createcontractor(contentcontractor contractor) boolean created=false; try String query="insert into CONTRACTOR(NAME,LASTNAME,ADDRESS,PHONE,VAT) values('"+contractor.getname()+"','"+ contractor.getlastname()+"','"+contractor.getaddress()+"','"+contractor.getphone()+"', '"+contractor.getvat()+"')"; yparxh"); if(!existvat(contractor.getvat())) SQLiteDatabase db=openhelper.getwritabledatabase(); db.execsql(query); created=true; db.close(); else Log.e("ContractorDataHelper::createContractor","To id catch(sqliteexception e) Log.e("ContractorDataHelper::createContractor", e.getmessage()); return created; 26

public boolean hascontractor() boolean value=false; try String query="select id from CONTRACTOR"; SQLiteDatabase db=openhelper.getwritabledatabase(); Cursor cursor=db.rawquery(query, null); if(cursor.movetofirst()) value=true; cursor.close(); db.close(); catch(sqliteexception e) Log.e("ContractorDataHelper::hasContractor", e.getmessage()); return value; /** * * @param id * @return */ public ContentContractor getcontractor() ContentContractor customer=new ContentContractor(); try String query="select * from CONTRACTOR "; SQLiteDatabase db=openhelper.getwritabledatabase(); Cursor cursor=db.rawquery(query, null); if(cursor.movetofirst()) customer.setid(cursor.getint(0)); customer.setname(cursor.getstring(1)); customer.setlastname(cursor.getstring(2)); customer.setaddress(cursor.getstring(3)); customer.setphone(cursor.getstring(4)); customer.setvat(cursor.getstring(5)); cursor.close(); db.close(); catch(sqliteexception e) Log.e("ContractorDataHelper::getContractor", e.getmessage()); return customer; /** * * @param vat * @return */ public boolean existvat(string vat) boolean exists=false; try String query="select vat from CONTRACTOR where vat='"+vat+"'"; SQLiteDatabase db=openhelper.getwritabledatabase(); Cursor cursor=db.rawquery(query, null); 27

exists=cursor.movetofirst(); cursor.close(); db.close(); catch(sqliteexception e) Log.e("ContractorDataHelper::existVAT", e.getmessage()); return exists; public boolean updatecontractor(contentcontractor contractor) boolean success=false; try SQLiteDatabase db=openhelper.getwritabledatabase(); String query="update CONTRACTOR set NAME='"+contractor.getName()+"',LASTNAME='"+contractor.getLastName()+"',ADDRESS='" +contractor.getaddress()+"',phone='"+contractor.getphone()+"',vat='"+contractor.getvat ()+"' where id="+contractor.getid(); db.execsql(query); db.close(); success=true; catch (SQLiteException e) Log.e("ContractorDataHelper::updateContractor",e.getLocalizedMessage()); success=false; return success; Κεφάλαιο 4 Οδηγίες εγκατάστασης και χρήσης της εφαρμογής Οδηγίες εγκατάστασης Για android έως 2.3 (Gingerbread) Από τις Ρυθμίσεις -> Εφαρμογές-> Άγνωστες πήγες (Ενεργοποιούμε) Για android από 4 (ICS) Από τις Ρυθμίσεις -> Ασφάλεια-> Άγνωστες πήγες (Ενεργοποιούμε) Προϋποθέτει: 28

Android 2.2 και μεγαλύτερο OpenGL 2.0 Google Play Account Αφού έχουμε ενεργοποιήσει τις άγνωστες πήγες κατεβάζουμε τα apk από το site και τα εγκαθιστούμε. Αν τα κατεβάσουμε από υπολογιστή τότε τα περνάμε μέσα στην συσκευή και με έναν file manager τα εγκαθιστούμε. Παρουσίαση της εφαρμογής Πρώτο ξεκίνημα Στο πρώτο ξεκίνημα βρίσκονται όλες οι παραμετροποιήσεις που πρέπει να γίνουν όταν τρέξει για πρώτη φορά η εφαρμογή. Πατώντας το κουμπί Ας αρχίσουμε ή μετακινώντας (scroll) προς τα αριστερά εμφανίζονται οι επιλογές. 29

Σχήμα 4.1 Ειδοποιήσεις και Καλλιεργητικό έτος Στην πρώτη καρτέλα επιλέγετε το τρέχων καλλιεργητικό έτος, αν ενεργοποιηθούν οι ειδοποιήσεις για εργασίες που είναι σε εξέλιξη καθώς και την ώρα που θα δημιουργούνται αυτές αν υπάρχουν. Στην συνέχεια πατώντας το κουμπί Επόμενο ή μετακινώντας (scroll) προς τα αριστερά εμφανίζεται η επόμενη καρτέλα. Συμπληρώστε τα στοιχεία σας. Στην καρτέλα αυτήν συμπληρώνονται τα στοιχεία του χρήστη. Αυτό το βήμα δεν είναι απαραίτητο. Όταν τελειώσει η παραμετροποίηση πατώντας ΤΕΛΟΣ ξεκινάει η εφαρμογή. Πελάτες Νέος πελάτης Για να δημιουργήσουμε νέο πελάτη από το κεντρικό μενού επιλέγουμε Πελάτες-> Νέος Πελάτης 30

Νέος Πελάτη ΚΑΤΑΧΏΡΗΣ Η Σχέδιο 4.2 Συμπληρώνουμε τα στοιχεία. Το όνομα και το επίθετο είναι υποχρεωτικά! Το ΑΦΜ δεν είναι υποχρεωτικό αλλά είναι μοναδικό. Δεν μπορεί δύο πελάτες να έχουν το ίδιο ΑΦΜ. Όταν συμπληρώσετε να στοιχεία του πελάτη πατήστε ΚΑΤΑΧΏΡΗΣΗ. Προβολή πελάτη Για να προβάλετε να στοιχεία ενός πελάτη από την καρτέλα πελάτη όπου βρίσκεστε πατήστε πάνω του για να εμφανιστεί το μενού πελάτη και επιλέξτε προβολή. 31

Επεξεργασία Αποθήκευση αλλαγών Αναίρεση αλλαγών Σχέδιο 4.3 Από την προβολή όπου βρίσκεστε μπορείτε είτε να επεξεργαστείτε τα στοιχεία του ή να τον διαγράψετε. *** Προσοχή όταν διαγράφετε έναν πελάτη διαγράφονται και οι εργασίες που σχετίζονται με τον συγκεκριμένο πελάτη. Διαγραφή πελάτη Μπορείτε να διαγράψετε τον πελάτη κατευθείαν από το μενού πελάτη χωρίς να πάτε στην προβολή. Σχέδιο 4.4 32

Προβολή εργασιών πελάτη Α) Προβολή όλων των εργασιών πελάτη Προβάλετε όλες τις εργασίες του πελάτη επιλέγοντας τον από την καρτέλα πελάτων και πατώντας Όλες οι εργασίες. Εμφανίζετε η λίστα με τις εργασίες που έχουν καταχωρηθεί στον πελάτη καθώς και το πλήθος και άθροισμα της αξίας όλων των εργασιών. Μπορείτε επίσης και να προβάλετε τις εργασίες στον χάρτη εφόσον έχετε καταχώρηση σημεία χωραφιού για κάθε εργασία. Προβολή των εργασιών στο χάρτη Σχέδιο 4.5 Όταν πατήσετε σε ένα σημείο χωραφιού στο χάρτη εμφανίζετε ένα παραθυράκι με περισσότερες πληροφορίες για την συγκεκριμένη εργασία. Πατώντας πάνω του μας πηγαίνει στην προβολή εργασίας. 33

Β) Προβολή εργασιών ανά είδος εργασίας. Για να προβάλετε εργασίες ενός πελάτη με συγκεκριμένο είδος εργασίας (π.χ. όλα τα οργώματα για τον συγκεκριμένο πελάτη) επιλέξτε Όλες οι εργασίες ανά είδος και έπειτα επιλέξτε το είδος. Αναζήτηση πελάτη Σχέδιο 4.6 Μπορείτε να αναζητήσετε έναν πελάτη από την καρτέλα των πελάτων. Με το όνομα, επίθετο,διεύθυνση, τηλέφωνο, ΑΦΜ. Ακύρωση φίλτρου Σχέδιο 4.7 34

Είδη εργασιών Νέο είδος εργασίας Για να δημιουργήσουμε νέο είδος εργασίας από το κεντρικό μενού επιλέγουμε Είδη εργασιών-> Νέο είδος εργασίας. Νέο είδος ΚΑΤΑΧΏΡΗΣΗ εργασίας Σχέδιο 4.8 Συμπληρώνουμε τα στοιχεία. Το όνομα είναι υποχρεωτικό! Το κόστος και το κέρδος δεν είναι υποχρεωτικά αλλά αν δεν συμπληρωθεί τουλάχιστον ένα από τα δύο το είδος θα έχει μηδενική τιμή. Όταν συμπληρώσετε να στοιχεία του είδους πατήστε ΚΑΤΑΧΏΡΗΣΗ. Προβολή είδους εργασίας Για να προβάλετε τα στοιχεία ενός είδους εργασίας από την καρτέλα Είδη εργασίας όπου βρίσκεστε πατήστε πάνω σε μία για να εμφανιστεί το μενού είδους και επιλέξτε προβολή. 35

Επεξεργασία Αποθήκευση αλλαγών Αναίρεση αλλαγών Σχέδιο 4.9 Από την προβολή όπου βρίσκεστε μπορείτε είτε να επεξεργαστείτε τα στοιχεία της ή να την διαγράψετε. *** Προσοχή όταν διαγράφετε ένα είδος εργασίας διαγράφονται και οι εργασίες που σχετίζονται με τον συγκεκριμένο είδος. Διαγραφή είδους εργασίας Μπορείτε να διαγράψετε το είδος εργασίας κατευθείαν από το μενού του είδους χωρίς να πάτε στην προβολή. Σχέδιο 4.10 36

Προβολή εργασιών του είδους εργασίας Α) Προβολή όλων των εργασιών του είδους Προβάλετε όλες τις εργασίες του είδους επιλέγοντας το από την καρτέλα είδη εργασίας και πατώντας Όλες οι εργασίες. Εμφανίζετε η λίστα με τις εργασίες που έχουν γίνει με το είδος καθώς και το πλήθος και άθροισμα της αξίας όλων των εργασιών. Μπορείτε επίσης και να προβάλετε τις εργασίες στον χάρτη εφόσον έχετε καταχώρηση σημεία χωραφιού για κάθε εργασία. Β) Προβολή εργασιών ανά πελάτη. Σχέδιο 4.11 Για να προβάλετε εργασίες ενός πελάτη με συγκεκριμένο είδος εργασίας (π.χ. όλα τα οργώματα για τον συγκεκριμένο πελάτη) επιλέξτε Όλες οι εργασίες ανά είδος και έπειτα επιλέξτε το είδος. Αναζήτηση ειδών εργασίας Μπορείτε να αναζητήσετε ένα είδος εργασίας από την καρτέλα των ειδών εργασιών. Με το όνομα είδους ή την σημείωση. 37

Ακύρωση φίλτρου Εργασίες-Ατζέντα Νέα εργασία Σχέδιο 4.12 Για να δημιουργήσετε μια νέα εργασία από το κεντρικό μενού πατήστε Νέα εργασία ή από το μενού της ατζέντας επιλέξτε Νέα εργασία. ή Σχήμα 4.13 Συμπληρώστε τα στοιχεία της φόρμας. Απαραίτητα είναι η επιλογή πελάτη, είδους εργασίας και έκταση χωραφιού. Μπορείτε επίσης να επιλέξετε και το χωράφι που θα γίνει η εργασία στον χάρτη, την ημερομηνία που θα γίνει η εργασία καθώς και ένα ποσοστό έκπτωσης στην τελική 38

τιμή της εργασίας. Αν η εργασία δεν έχει ολοκληρωθεί μπορείτε να πάρετε ειδοποίηση για την συγκεκριμένη εργασία αν επιλέξετε Ειδοποίησε με. Επιλογή πελάτη Ημερομηνία εργασίας Επιλογή είδους εργασίας Μέγεθος χωραφιού Σημείωση εργασίας Επιλογή χωραφιού στον χάρτη Σχήμα 4.13 Ενεργοποίηση ειδοποίησης για την εργασία Τιμή χωρίς έκπτωσης Τελική τιμή με έκπτωση Ολοκληρωμένες εργασίες Εργασίες σε εξέλιξη Οι εργασίες χωρίζονται σε δύο κατηγορίες στις Ολοκληρωμένες και σε Εξέλιξη Ολοκληρωμένες θεωρούνται οι εργασίες που έχουν γινεί και σε εξέλιξη αυτές που θα γίνουν στο μέλλον. Αν επιλέξετε την εργασία ως Ολοκληρωμένη τότε η εργασία τοποθετείτε στις ολοκληρωμένες εργασίες στην ατζέντα και καταργείτε η ειδοποίηση αν έχει. Αν επιλέξετε την εργασία ως Ειδοποίησε με τότε καταργείτε η κατάσταση ολοκληρωμένη αν έχει επιλεχθεί και η εργασία τοποθετείτε στις σε εξέλιξη εργασίες στην ατζέντα και ενεργοποιήτε η ειδοποίηση για αυτήν. Προβολή εργασίας Για να προβάλουμε μια εργασία από το κεντρικό μενού επιλέγουμε Ατζέντα. Στην ατζέντα υπάρχουν δυο καρτέλες. Οι ολοκληρωμένες εργασίες και οι εργασίες σε εξέλιξη. Για να προβάλουμε μια εργασία πατάμε πάνω της. 39

Επεξεργασία εργασίας Διαγραφή εργασίας Αποθήκευση αλλαγών Αναίρεση αλλαγών Σχέδιο 4.14 Για να επεξεργαστείτε τα στοιχεία μίας εργασίας από την προβολή πατήστε το μολύβι για να ενεργοποιηθεί η φόρμα και να μπορείτε να κάνετε αλλαγές. Πατώντας στο εικονίδιο της δισκέτας αποθηκεύονται οι αλλαγές. Αν θέλετε να αναιρέσετε τις αλλαγές που έχετε κάνει πατήστε στο εικονίδιο της αναίρεσης. Προβολή εργασιών ανά πελάτη είδος εργασίας Μπορείτε να προβάλλετε τις εργασίες που έχετε κάνει σε έναν πελάτη ανά είδος εργασίας επιλέγοντας από το μενού της ατζέντας. *** Τα αποτελέσματα φιλτράρονται ανάλογα σε ποια καρτέλα βρίσκεστε. Δηλαδή στις εργασίες σε εξέλιξη ή στις ολοκληρωμένες εργασίες. Επίσης μπορείτε να προβάλετε και τις εργασίες ανά είδος εργασίας πελάτη. 40

Σχέδιο 4.15 Προβολή εργασιών στο χάρτη. Μπορείτε να προβάλετε όλες τις εργασίες ανάλογα σε ποια καρτέλα βρίσκεστε ( Ολοκληρωμένες Σε εξέλιξη εργασίες) στο χάρτη. Σχέδιο 4.16 41

Ρυθμίσεις Ειδοποιήσεις και καλλιεργητικό έτος Με τη δημιουργία ενός νέου καλλιεργητικό έτους παίρνεται ένα αντίγραφο ασφαλείας με όλα τα δεδομένα και δημιουργείται το νέο με όλα τα πεδία κενά. Αν επιλεγεί ένα έτος που ήδη υπάρχει τότε γίνεται αυτόματα επαναφορά των δεδομένων. Σχέδιο 4.17 Ειδοποιήσεις Μπορείτε να παίρνετε καθημερινά ειδοποιήσεις για τις εργασίες που είναι σε εξέλιξη και έχουν προγραμματιστεί να γίνουν τη συγκεκριμένη μέρα ρυθμίζοντας και την ώρα που το κινητό σας θα σας ειδοποιεί. Επεξεργασία στοιχείων Μπορείτε να αλλάξετε τα προσωπικά σας στοιχεία. 42

Αντίγραφα Ασφαλείας και Επαναφορά Σχέδιο 4.18 Δημιουργία Αντιγράφων Ασφαλείας. Με την επιλογή της συγκεκριμένης ρύθμισης μπορείτε να αποθηκεύετε όλα τα δεδομένα της τρέχουσας βάσης στο αντίγραφο ασφαλείας του τρέχοντος καλλιεργητικού έτους. Αν υπάρχει ήδη αντίγραφο ασφαλείας του έτους τότε θα αντικατασταθεί. Σχέδιο 4.19 43

Επαναφορά Αντιγράφων Ασφαλείας Μπορείτε άμεσα να επανακτήσετε όλα τα δεδομένα ενός καλλιεργητικού έτους επιλέγοντάς το. Σχέδιο 4.20 Εισαγωγή Δεδομένων Μπορείτε να εισάγετε πελάτες και είδη εργασιών από άλλα καλλιεργητικά έτη. Σχέδιο 4.21 44

Καθαρισμός όλων των δεδομένων. Διαγράφει όλα τα δεδομένα του τρέχοντος καλλιεργητικού έτους χωρίς να μεταβάλλει το αντίγραφο ασφαλείας του τρέχοντος καλλιεργητικού έτους (αν υπάρχει). Σχέδιο 4.22 45