OVIDIUS University of Constant a [616598]

Ministry of National Education
"OVIDIUS" University of Constant a
Faculty of Mathematics and Computer Science
Degree Program: Computer Science
Home Assistant for Elderly People
Scienti c Adviser:
Conf. dr. Pelican Elena
Student: [anonimizat] a
2018

Outline
Outline 1
1 Our Problem 2
2 Features 3
3 Solutions 4
4 Application 15
5 Future works 16
1

Chapter 1
Our Problem
This idea came to life from the desire of easing the lives of elderly people. How
will it ease their lives? Simple! This application is designed to the needs of the elderly,
it has features that will help them throughout the day.
I gave the application the name "Aletheia" which is a greek word that can be
translasted as truth or disclosure. But there is also a literal meaning to the word,meaning
the state of not being hidden or being evident.
The reason why I chose this word was because it is the oposite of the word lethe,
that can be translated to forgetfulness, oblivion or concealment.
2

Chapter 2
Features
Up until now the application contain three functional features:
.Reminder
.Chatbot
.Face recognition
Reminder
I thought of the application to have a reminder activity that will help the user re-
member activities or events. For example this part of the application could be used
for taking pills, or checking every night before bedtime if the doors and windows are
closed. This activity has the following functionalities:
.a date picker, so the user can choose the data of a certain event or activity
.a time picker, so the user can choose the time of the said activity or event
.a repeat function, so the user can choose if the activity he is creating is a repeating
one or not
.a repetition interval, so the user can choose the interval of the repeating activity
.the type of repetition, e.g hourly, daily, weekly etc.
Chatbot
The application has integrated a chatbot functionality mainly to help entertaining the
elders, helping them in di erent activities and socialize with them.
Face recognition
The last functionality is it for a rather extreme case. I thought about integrating a
facial recgnition in the application so it can be used mostly by people who su ers from
alzheimer and they cannot recognize even their family.
3

Chapter 3
Solutions
Reminder
package o v i d i u s . univ . myapplication ;
import android . content . Intent ;
import android . os . Bundle ;
import android . support . v7 . app . AppCompatActivity ;
import android . support . v7 . widget . LinearLayoutManager ;
import android . support . v7 . widget . RecyclerView ;
import android . support . v7 . widget . Toolbar ;
import android . view . ContextMenu ;
import android . view . L ay o u t I nf l a t e r ;
import android . view . Menu ;
import android . view . MenuItem ;
import android . view . View ;
import android . view . ViewGroup ;
import android . widget . ImageView ;
import android . widget . TextView ;
import android . widget . Toast ;
import com . amulyakhare . textdrawable . TextDrawable ;
import com . amulyakhare . textdrawable . u t i l . ColorGenerator ;
import com . bignerdranch . android . m u l t i s e l e c t o r . ModalMultiSelectorCallback ;
import com . bignerdranch . android . m u l t i s e l e c t o r . Mu l ti S el ec t or ;
import com . bignerdranch . android . m u l t i s e l e c t o r . SwappingHolder ;
import com . getbase . f l o a t i n g a c t i o n b u t t o n . FloatingActionButton ;
import java . text . DateFormat ;
import java . text . ParseException ;
import java . text . SimpleDateFormat ;
import java . u t i l . ArrayList ;
import java . u t i l . C o l l e c t i o n s ;
4

Solutions Solutions
import java . u t i l . Comparator ;
import java . u t i l . LinkedHashMap ;
import java . u t i l . L i s t ;
public c l a s s MainActivity extends AppCompatActivity f
p r i v a t e RecyclerView mList ;
p r i v a t e SimpleAdapter mAdapter ;
p r i v a t e Toolbar mToolbar ;
p r i v a t e TextView mNoReminderView ;
p r i v a t e FloatingActionButton mAddReminderButton ;
p r i v a t e i n t mTempPost ;
p r i v a t e LinkedHashMap <Integer , Integer >IDmap = new LinkedHashMap <>();
p r i v a t e ReminderDatabase rb ;
p r i v a t e Mu l ti Se l ec t or mMultiSelector = new Mu lt i Se le c to r ( ) ;
p r i v a t e AlarmReciever mAlarmReceiver ;
@Override
protected void onCreate ( Bundle savedInstanceState ) f
super . onCreate ( savedInstanceState ) ;
setContentView (R. layout . a c ti v it y m ai n ) ;
// I n i t i a l i z e reminder database
rb = new ReminderDatabase ( getApplicationContext ( ) ) ;
// I n i t i a l i z e views
mToolbar = ( Toolbar ) findViewById (R. id . toolbar ) ;
mAddReminderButton = ( FloatingActionButton ) findViewById (R. id . add reminder ) ;
mList = ( RecyclerView ) findViewById (R. id . r e m i n d e r l i s t ) ;
mNoReminderView = ( TextView ) findViewById (R. id . no reminder text ) ;
// To check i s there are saved reminders
// I f there are no reminders d i s p l a y a message asking the user to c r e a t e reminders
List <Reminder >mTest = rb . getAllReminders ( ) ;
i f ( mTest . isEmpty ( ) ) f
mNoReminderView . s e t V i s i b i l i t y ( View . VISIBLE ) ;
g
// Create r e c y c l e r view
mList . setLayoutManager ( getLayoutManager ( ) ) ;
registerForContextMenu ( mList ) ;
mAdapter = new SimpleAdapter ( ) ;
mAdapter . setItemCount ( getDefaultItemCount ( ) ) ;
mList . setAdapter ( mAdapter ) ;
// Setup toolbar
5

Solutions Solutions
setSupportActionBar ( mToolbar ) ;
mToolbar . s e t T i t l e (R. s t r i n g . app name ) ;
// On c l i c k i n g the f l o a t i n g action button
mAddReminderButton . setOnClickListener (new View . OnClickListener ( ) f
@Override
public void onClick ( View v ) f
Intent i n t e n t = new Intent ( v . getContext ( ) , ReminderAddActivity . c l a s s ) ;
s t a r t A c t i v i t y ( i n t e n t ) ;
g
g) ;
// I n i t i a l i z e alarm
mAlarmReceiver = new AlarmReciever ( ) ;
g
// Create context menu f o r long press a c t i o n s
@Override
public void onCreateContextMenu ( ContextMenu menu , View v , ContextMenu . ContextMenuInfo menuInfo ) f
getMenuInflater ( ) . i n f l a t e (R. menu . menu add reminder , menu ) ;
g
// Multi s e l e c t items in r e c y c l e r view
p r i v a t e android . support . v7 . view . ActionMode . Callback mDeleteMode = new ModalMultiSelectorCallback ( mMultiSelector ) f
@Override
public boolean onCreateActionMode ( android . support . v7 . view . ActionMode actionMode , Menu menu) f
getMenuInflater ( ) . i n f l a t e (R. menu . menu add reminder , menu ) ;
return true ;
g
@Override
public boolean onActionItemClicked ( android . support . v7 . view . ActionMode actionMode , MenuItem menuItem ) f
switch ( menuItem . getItemId ( ) ) f
// On c l i c k i n g discard reminders
case R. id . discard reminder :
// Close the context menu
actionMode . f i n i s h ( ) ;
// Get the reminder id a s s o c i a t e d with the r e c y c l e r view item
f o r ( i n t i = IDmap . s i z e ( ) ; i >= 0 ; i)f
i f ( mMultiSelector . i s S e l e c t e d ( i , 0)) f
i n t id = IDmap . get ( i ) ;
// Get reminder from reminder database using id
6

Solutions Solutions
Reminder temp = rb . getReminder ( id ) ;
// Delete reminder
rb . deleteReminder ( temp ) ;
// Remove reminder from r e c y c l e r view
mAdapter . removeItemSelected ( i ) ;
// Delete reminder alarm
mAlarmReceiver . cancelAlarm ( getApplicationContext ( ) , id ) ;
g
g
// Clear s e l e c t e d items in r e c y c l e r view
mMultiSelector . c l e a r S e l e c t i o n s ( ) ;
// Recreate the r e c y c l e r items
// This i s done to remap the item and reminder i d s
mAdapter . onDeleteItem ( getDefaultItemCount ( ) ) ;
// Display toast to confirm d e l e t e
Toast . makeText ( getApplicationContext ( ) ,
" Deleted " ,
Toast .LENGTH SHORT) . show ( ) ;
// To check i s there are saved reminders
// I f there are no reminders d i s p l a y a message asking the user to c r e a t e reminders
List <Reminder >mTest = rb . getAllReminders ( ) ;
i f ( mTest . isEmpty ( ) ) f
mNoReminderView . s e t V i s i b i l i t y ( View . VISIBLE ) ;
ge l s ef
mNoReminderView . s e t V i s i b i l i t y ( View .GONE) ;
g
return true ;
// On c l i c k i n g save reminders
case R. id . save reminder :
// Close the context menu
actionMode . f i n i s h ( ) ;
// Clear s e l e c t e d items in r e c y c l e r view
mMultiSelector . c l e a r S e l e c t i o n s ( ) ;
return true ;
d e f a u l t :
break ;
g
return f a l s e ;
g
7

Solutions Solutions
g;
// On c l i c k i n g a reminder item
p r i v a t e void selectReminder ( i n t mClickID ) f
String mStringClickID = I n t e g e r . to Str ing ( mClickID ) ;
// Create i n t e n t to e d i t the reminder
// Put reminder id as extra
Intent i = new Intent ( this , ReminderEditActivity . c l a s s ) ;
i . putExtra ( ReminderEditActivity .EXTRA REMINDER ID, mStringClickID ) ;
s t a r t A c t i v i t y F o r R e s u l t ( i , 1 ) ;
g
@Override
public void onActivityResult ( i n t requestCode , i n t resultCode , Intent data ) f
mAdapter . setItemCount ( getDefaultItemCount ( ) ) ;
g
// Recreate r e c y c l e r view
// This i s done so that newly created reminders are displayed
@Override
public void onResume () f
super . onResume ( ) ;
// To check i s there are saved reminders
// I f there are no reminders d i s p l a y a message asking the user to c r e a t e reminders
List <Reminder >mTest = rb . getAllReminders ( ) ;
i f ( mTest . isEmpty ( ) ) f
mNoReminderView . s e t V i s i b i l i t y ( View . VISIBLE ) ;
ge l s ef
mNoReminderView . s e t V i s i b i l i t y ( View .GONE) ;
g
mAdapter . setItemCount ( getDefaultItemCount ( ) ) ;
g
// Layout manager f o r r e c y c l e r view
protected RecyclerView . LayoutManager getLayoutManager ( ) f
return new LinearLayoutManager ( this , LinearLayoutManager .VERTICAL, f a l s e ) ;
g
protected i n t getDefaultItemCount ( ) f
return 100;
g
8

Solutions Solutions
// Create menu
@Override
public boolean onCreateOptionsMenu (Menu menu) f
getMenuInflater ( ) . i n f l a t e (R. menu . main menu , menu ) ;
return true ;
g
// Adapter c l a s s f o r r e c y c l e r view
public c l a s s SimpleAdapter extends RecyclerView . Adapter <SimpleAdapter . VerticalItemHolder >f
p r i v a t e ArrayList <ReminderItem >mItems ;
public SimpleAdapter ( ) f
mItems = new ArrayList <>();
g
public void setItemCount ( i n t count ) f
mItems . c l e a r ( ) ;
mItems . addAll ( generateData ( count ) ) ;
notifyDataSetChanged ( ) ;
g
public void onDeleteItem ( i n t count ) f
mItems . c l e a r ( ) ;
mItems . addAll ( generateData ( count ) ) ;
g
public void removeItemSelected ( i n t s e l e c t e d ) f
i f ( mItems . isEmpty ( ) ) return ;
mItems . remove ( s e l e c t e d ) ;
notifyItemRemoved ( s e l e c t e d ) ;
g
// View holder f o r r e c y c l e r view items
@Override
public VerticalItemHolder onCreateViewHolder ( ViewGroup container , i n t viewType ) f
L a y ou t I n f la t e r i n f l a t e r = L a y o u tI n f l a te r . from ( container . getContext ( ) ) ;
View root = i n f l a t e r . i n f l a t e (R. layout . r e c y c l e i t e m s , container , f a l s e ) ;
return new VerticalItemHolder ( root , t h i s ) ;
g
@Override
public void onBindViewHolder ( VerticalItemHolder itemHolder , i n t p o s i t i o n ) f
ReminderItem item = mItems . get ( p o s i t i o n ) ;
9

Solutions Solutions
itemHolder . setReminderTitle ( item . mTitle ) ;
itemHolder . setReminderDateTime ( item . mDateTime ) ;
itemHolder . setReminderRepeatInfo ( item . mRepeat , item . mRepeatNo , item . mRepeatType ) ;
itemHolder . setActiveImage ( item . mActive ) ;
g
@Override
public i n t getItemCount ( ) f
return mItems . s i z e ( ) ;
g
// Class f o r r e c y c l e r view items
public c l a s s ReminderItem f
public String mTitle ;
public String mDateTime ;
public String mRepeat ;
public String mRepeatNo ;
public String mRepeatType ;
public String mActive ;
public ReminderItem ( String Title , String DateTime , String Repeat , String RepeatNo , String RepeatType , String Active ) f
t h i s . mTitle = T i t l e ;
t h i s . mDateTime = DateTime ;
t h i s . mRepeat = Repeat ;
t h i s . mRepeatNo = RepeatNo ;
t h i s . mRepeatType = RepeatType ;
t h i s . mActive = Active ;
g
g
// Class to compare date and time so that items are sorted in ascending order
public c l a s s DateTimeComparator implements Comparator f
DateFormat f = new SimpleDateFormat ("dd/m m/yyyy hh :m m" ) ;
public i n t compare ( Object a , Object b) f
String o1 = ( ( DateTimeSorter ) a ) . getDateTime ( ) ;
String o2 = ( ( DateTimeSorter )b ) . getDateTime ( ) ;
tryf
return f . parse ( o1 ) . compareTo ( f . parse ( o2 ) ) ;
gcatch ( ParseException e ) f
throw new IllegalArgumentException ( e ) ;
g
g
g
10

Solutions Solutions
// UI and data c l a s s f o r r e c y c l e r view items
public c l a s s VerticalItemHolder extends SwappingHolder
implements View . OnClickListener , View . OnLongClickListener f
p r i v a t e TextView mTitleText , mDateAndTimeText , mRepeatInfoText ;
p r i v a t e ImageView mActiveImage , mThumbnailImage ;
p r i v a t e ColorGenerator mColorGenerator = ColorGenerator .DEFAULT;
p r i v a t e TextDrawable mDrawableBuilder ;
p r i v a t e SimpleAdapter mAdapter ;
public VerticalItemHolder ( View itemView , SimpleAdapter adapter ) f
super ( itemView , mMultiSelector ) ;
itemView . setOnClickListener ( t h i s ) ;
itemView . setOnLongClickListener ( t h i s ) ;
itemView . setLongClickable ( true ) ;
// I n i t i a l i z e adapter f o r the items
mAdapter = adapter ;
// I n i t i a l i z e views
mTitleText = ( TextView ) itemView . findViewById (R. id . r e c y c l e t i t l e ) ;
mDateAndTimeText = ( TextView ) itemView . findViewById (R. id . r e c y c l e d a t e t i m e ) ;
mRepeatInfoText = ( TextView ) itemView . findViewById (R. id . r e c y c l e r e p e a t i n f o ) ;
mActiveImage = ( ImageView ) itemView . findViewById (R. id . active image ) ;
mThumbnailImage = ( ImageView ) itemView . findViewById (R. id . thumbnail image ) ;
g
// On c l i c k i n g a reminder item
@Override
public void onClick ( View v ) f
i f ( ! mMultiSelector . t a p S e l e c t i o n ( t h i s ) ) f
mTempPost = mList . getChildAdapterPosition ( v ) ;
i n t mReminderClickID = IDmap . get (mTempPost ) ;
selectReminder ( mReminderClickID ) ;
ge l s e i f ( mMultiSelector . g e t S e l e c t e d P o s i t i o n s ( ) . isEmpty ( ) ) f
mAdapter . setItemCount ( getDefaultItemCount ( ) ) ;
g
g
// On long press enter action mode with context menu
@Override
public boolean onLongClick ( View v ) f
AppCompatActivity a c t i v i t y = MainActivity . t h i s ;
a c t i v i t y . startSupportActionMode ( mDeleteMode ) ;
mMultiSelector . s e t S e l e c t e d ( this , true ) ;
11

Solutions Solutions
return true ;
g
// Set reminder t i t l e view
public void setReminderTitle ( String t i t l e ) f
mTitleText . setText ( t i t l e ) ;
String l e t t e r = "A" ;
i f ( t i t l e != n u l l && ! t i t l e . isEmpty ( ) ) f
l e t t e r = t i t l e . s u b s t r i n g (0 , 1 ) ;
g
i n t c o l o r = mColorGenerator . getRandomColor ( ) ;
// Create a c i r c u l a r icon c o n s i s t i n g of a random background colour and f i r s t l e t t e r of t i t l e
mDrawableBuilder = TextDrawable . b u i l d e r ( )
. buildRound ( l e t t e r , c o l o r ) ;
mThumbnailImage . setImageDrawable ( mDrawableBuilder ) ;
g
// Set date and time views
public void setReminderDateTime ( String datetime ) f
mDateAndTimeText . setText ( datetime ) ;
g
// Set repeat views
public void setReminderRepeatInfo ( String repeat , String repeatNo , String repeatType ) f
i f ( repeat . equals (" true ")) f
mRepeatInfoText . setText (" Every " + repeatNo + " " + repeatType + "( s ) " ) ;
ge l s e i f ( repeat . equals (" f a l s e ")) f
mRepeatInfoText . setText (" Repeat Off " ) ;
g
g
// Set a c t i v e image as on or o f f
public void setActiveImage ( String a c t i v e ) f
i f ( a c t i v e . equals (" true ")) f
mActiveImage . setImageResource (R. drawable . b a s e l i n e c l e a r w h i t e 1 8 d p ) ;
ge l s e i f ( a c t i v e . equals (" f a l s e ")) f
mActiveImage . setImageResource (R. drawable . baseline done white 18dp ) ;
g
g
g
// Generate random t e s t data
public ReminderItem generateDummyData ( ) f
12

Solutions Solutions
return new ReminderItem ("1" , "2" , "3" , "4" , "5" , " 6 " ) ;
g
// Generate r e a l data f o r each item
public List <ReminderItem >generateData ( i n t count ) f
ArrayList <SimpleAdapter . ReminderItem >items = new ArrayList <>();
// Get a l l reminders from the database
List <Reminder >reminders = rb . getAllReminders ( ) ;
// I n i t i a l i z e l i s t s
List <String >T i t l e s = new ArrayList <>();
List <String >Repeats = new ArrayList <>();
List <String >RepeatNos = new ArrayList <>();
List <String >RepeatTypes = new ArrayList <>();
List <String >Actives = new ArrayList <>();
List <String >DateAndTime = new ArrayList <>();
List <Integer >IDList= new ArrayList <>();
List <DateTimeSorter >DateTimeSortList = new ArrayList <>();
// Add d e t a i l s of a l l reminders in t h e i r r e s p e c t i v e l i s t s
f o r ( Reminder r : reminders ) f
T i t l e s . add ( r . g e t T i t l e ( ) ) ;
DateAndTime . add ( r . getDate ( ) + " " + r . getTime ( ) ) ;
Repeats . add ( r . getRepeat ( ) ) ;
RepeatNos . add ( r . getRepeatNo ( ) ) ;
RepeatTypes . add ( r . getRepeatType ( ) ) ;
Actives . add ( r . getActive ( ) ) ;
IDList . add ( r . getID ( ) ) ;
g
i n t key = 0 ;
// Add date and time as DateTimeSorter o b j e c t s
f o r ( i n t k = 0 ; k <T i t l e s . s i z e ( ) ; k++) f
DateTimeSortList . add (new DateTimeSorter ( key , DateAndTime . get ( k ) ) ) ;
key++;
g
// Sort items according to date and time in ascending order
C o l l e c t i o n s . s o r t ( DateTimeSortList , new DateTimeComparator ( ) ) ;
i n t k = 0 ;
// Add data to each r e c y c l e r view item
f o r ( DateTimeSorter item : DateTimeSortList ) f
13

Solutions Solutions
i n t i = item . getIndex ( ) ;
items . add (new SimpleAdapter . ReminderItem ( T i t l e s . get ( i ) , DateAndTime . get ( i ) , Repeats . get ( i ) ,
RepeatNos . get ( i ) , RepeatTypes . get ( i ) , Actives . get ( i ) ) ) ;
IDmap . put (k , IDList . get ( i ) ) ;
k++;
g
return items ;
g
g
g
14

Chapter 4
Application
15

Chapter 5
Future works
16

Similar Posts