WEB PONDER, AN OPEN SCHOOL MANAGEMENT NETWORK
A Project
Presented to the faculty of the Department of Computer Science
California State University, Sacramento
Submitted in partial satisfaction of the requirements for the degree of
MASTER OF SCIENCE in
Computer Science by
Raghavendra Rao Karamballi
SPRING
2014
WEB PONDER, AN OPEN SCHOOL MANAGEMENT NETWORK
A Project by
Raghavendra Rao Karamballi
Approved by:
__________________________________, Committee Chair
Jinsong Ouyang, Ph.D.
__________________________________, Second Reader
Ying Jin, Ph.D.
____________________________
Date ii
Student: Raghavendra Rao Karamballi
I certify that this student has met the requirements for format contained in the University format manual, and that this project is suitable for shelving in the Library and credit is to be awarded for the project.
__________________________, Graduate Coordinator
Nikrouz Faroughi , Ph.D.
Department of Computer Science iii
________________
Date
Abstract
of
WEB PONDER, AN OPEN SCHOOL MANAGEMENT NETWORK
by
Raghavendra Rao Karamballi
Web ponder, an open school management network is an Android based mobile application (app). This application provides an educational network for students who are studying from class K-8. This application follows Process-oriented schooling, by incorporating and streamlining regular school and extracurricular tasks and activities. The approach followed is a MPC (Methodology, Process and Character) focused schooling, instead of just learning knowledge and skills. This application helps students to become smart, by providing features like task management and time management, when compared to their peers who don’t use this app. Instructors who have experience in shaping the career of the students can create a schedule for the subject. Students who are enrolled for the course will be sent notification alarm at the scheduled time. Instructors are also provided with the option of video-enabled teaching as well as for monitoring the progress. iv
This application has additional features like sending messages, stop-clock for the task tracking, viewing calendar, grading option for course by students (self-grading) and instructor. Application is developed using Android API’s for front end and .Net Web Api for creating Restful web service.
_______________________, Committee Chair
Jinsong Ouyang, Ph.D.
_______________________
Date v
I would like to thank Dr. Jinsong Ouyang, my project advisor for providing me a wonderful opportunity to work on this project, which provided a great exposure to the field of Android Mobile Application Development. I thank him for providing all the help, support and necessary resources to complete the project successfully. Dr. Ouyang helped me in understanding the project in detail and provided knowledge and expertise in the field to understand the project and completing it successfully.
In addition, I would like to thank Dr. Ying Jin for her willingness to serve on the committee.
Lastly, I would like to thank the entire faculty and staff of the Department of Computer
Science Engineering at California State University, Sacramento. vi
TABLE OF CONTENTS
Chapter
vii
3. DESIGN & IMPLEMENTATION OF THE APPLICATION ...................................25
viii
ix
LIST OF FIGURES
Figure Page
x
1
This application provides lot of features required for the school. The following functionalities give a brief overview of the essential services provided and objective of this application.
Task management: creation, assignment, delegation, monitoring and reporting
Time management: alert/notification, check-in/check-out and reporting
Assignment : Self reporting as well as Instructor grade reporting
Calendar support for above services
Email and text communications for above services
Mobile interfaces for above services
1.1 Features and Functionalities
Admin o Creating classes o Enrolling students into a class o Creating courses o Creating course tasks/ activities o Creating daily, weekly, monthly or yearly schooling processes that consist of a sequence of tasks o Assigning/ delegating tasks to students/ instructors in a class o Looking up daily, weekly and monthly class schedules o Reviewing daily reports and status reports
2 o Alert, notification and email/text communications with coordinator and students
Instructor o Creating course modules including lectures and assignments o Grading tasks o Looking up daily, weekly and monthly class schedules o Monitoring course timelines o Reviewing course daily and status reports o Alert, notification and email/text communications with coordinator and students o Video Call interaction
Student o Looking up daily, weekly and monthly class schedules o Signing in a task o Submitting task work o Email/text communications with coordinator and students
1.2 Objectives
Providing an educational network for K-8 students that features:
Task management: Processes are modularized into tasks ( a process consists of a sequence of tasks), and monitored and managed on a daily, weekly, monthly and yearly basis.
3
Time Management: Time based processes enable the development of students' ability to effectively and efficiently utilize their time
4
1.3 ER-diagram
This project has 3 main actors: Admin, Instructors and Students. The functionality of
Admin/Instructor is almost the same. Admin is the highly responsible for the maintenance of the application. Admin adds the instructor to the application. Students are registered to the application by themselves. Each subject is associated as a schedule.
Admin creates the schedule which is divided into multiple tasks based on the course requirements. Each schedule task is updated in the database and in the Google calendar.
Saving the tasks in the Google calendar will provide the advantage of portability and it acts like cloud based storage for the application. The Instructor is responsible for enrolling the interested students to the course. Only students who are enrolled to the course can enjoy the benefits of the lecture. The students as well as the instructor will receive notification for the scheduled task at the scheduled time. New notification is received when the schedule event is updated by the instructor. Students can self-grade the tasks as soon as the task is completed. Students are provided with stop-clock to perform the scheduled task. Instructor can grade the student at the end of the day. All the message communications between students and instructor are also saved in the database. This provides the benefit to track the communication as a record log. The database tables like subject_roster, group_roster reduces the redundancy in the data entry. The interest_group table holds the details of the students and the instructor who teaches the subject. This table provides us the flexibility of aliasing the mail ID’s for easy communication.
5
Figure 1. ER diagram
6
2.1 Broadcast receiver
With references to [1-9][29], a Broadcast Receiver object is only valid for the duration of the call to onReceive (Context, Intent). Once your code returns from this function, the system considers the object to be finished and no longer active.
In particular, you may not show a dialog or bind to a service from within a Broadcast
Receiver. For the former, you should instead use the NotificationManager API. For the latter, you can use Context.startService () to send a command to the service.
This means that for longer-running operations you will often use a Service in conjunction with a Broadcast Receiver to keep the containing process active for the entire time of your operation.
Code snippet explanation: The AlarmReceiver class extends BroadcastReciever class.
This helps the application to service the services which are published and exchange information. The Activity class will invoke the intent for the Broadcast class, and then receiving broadcast class will start the service, where the required operation for the application is done. public class AlarmReceiver extends BroadcastReceiver { public static final String ACTION = "ScheduleMapp.service.alarm"; public static final int REQUEST_CODE = 12345; //unique request code
// triggered by the Alarm periodically (starts the service to run task)
@Override
public void onReceive (Context context, Intent intent) {
Intent intent_service = new Intent (context, TestService.class);
intent_service .putExtra ("servicestart", "TestInformation");
context.startService (intent_service); }
}
7
} public class MyReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Bundle extras = intent.getExtras();
String message = extras.getString("EXTRA");
Intent service1 = new Intent(context, AlarmService.class);
service1.putExtra("EXTRA", message);
context.startService(service1);
}
protected void onHandleIntent(Intent intent) {
}
System.out.println("HEre");
2.2 Intent Service
With references to [1-9][29], the Intent Service class provides a straightforward structure for running an operation on a single background thread. This allows it to handle longrunning operations without affecting your user interface's responsiveness. Also, an
IntentService isn't affected by most user interface lifecycle events, so it continues to run in circumstances that would shut down an AsyncTask
An IntentService has a few limitations
It can't interact directly with your user interface. To put its results in the UI, you have to send them to an Activity.
Work requests run sequentially. If an operation is running in an IntentService, and you send it another request, the request waits until the first operation is finished.
8
An operation running on an IntentService can't be interrupted.
However, in most cases an IntentService is the preferred way to simple background operations.
Code snippet explanation: The TestService class extends IntentService class.
This is called for any service which needs to happening continuously in the back end.
Onhandleintent method is executed when a service call is made, this can be used to return a value back to the activity. This service is intended for scheduling an alarm which verifies for any updates in the calendar event and when any scheduled task is there, a notification is sent to the user. public class TestService extends IntentService { public TestService () { super ("TestService ");
}
@Override
protected void onHandleIntent (Intent intent) {
Log.i ("TestService", "Service running");
Intent intent_MainActivity = new Intent("com.example.MainActivity");
inent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity (intent_MainActivity);
}
}
2.3 Service
With references from [1-9][29], Service itself is actually very simple, providing two main features:
•
A facility for the application to tell the system about something it wants to be doing in the background (even when the user is not directly interacting with the
9 application). This corresponds to calls to Context.startService (), which ask the system to schedule work for the service, to be run until the service or someone else explicitly stop it.
A facility for an application to expose some of its functionality to other applications.
This corresponds to calls to Context.bindService (), which allows a long-standing connection to be made to the service in order to interact with it.
Service Lifecycle
There are two reasons that a service can be run by the system. If someone calls
Context.startService () then the system will retrieve the service (creating it and calling its onCreate () method if needed) and then call its onStartCommand (Intent, int, int) method with the arguments supplied by the client. The service will at this point continue running until Context.stopService () or stopSelf () is called. Note that multiple calls to Context.startService() do not nest (though they do result in multiple corresponding calls to onStartCommand()), so no matter how many times it is started a service will be stopped once Context.stopService() or stopSelf() is called; however, services can use their stopSelf(int) method to ensure the service is not stopped until started intents have been processed.
In the code snippet [35], mentions how to launch different application from the existing application. The component name is declared with the pair of package name and the class name. When the start activity is invoked, the android service will search for the
10 mentioned package name. If exact match of package and class name is found, the android application will start that intent.
Code snippet explanation: The service class helps to execute code which needs long time of execute. During this execution of code will not interact with user or any functions dependent on other activities. When the onStart function is called, the code snippet sends the alarm notification to the user for notification. As soon as this service is called, this notifies to the user that a task is schedule to be performed. The variables declaration like mManager which is an instance of notification manager class, notification which is an instance of Notification class are useful in creating an image, event information, onclick on event activity etc..,
In the code snippet [35], mentions how to launch different application from the existing application. The component name is declared with the pair of package name and the class name. When the start activity is invoked, the android service will search for the mentioned package name. If exact match of package and class name is found, the android application will start that intent.
In the snippet, when the user receives a notification, user clicks on notification message, the scheduleapp is opened.
@Override public void onCreate() {
}
// TODO Auto-generated method stub super. OnCreate(); public void onReceive(Context arg0, Intent intent) {
Bundle extras = intent.getExtras();
now!",
}
} public int onStartCommand(Intent intent, int flags, int startId) { try { if (intent.getStringExtra("EXTRA") != null) {
String message = extras.getString("EXTRA");
}
String str = intent.getStringExtra("EXTRA");
// sent from BroadcastReceiver messagerecvd = str;
} catch (Exception e) {
} return super. OnStartCommand(intent, flags, startId);
@SuppressWarnings({ "static-access", "deprecation" })
@Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); try { mManager = (NotificationManager) this.getApplicationContext()
.getSystemService( this.getApplicationContext().NOTIFICATION_SERVICE);
Intent intent1 = new
Intent(this.getApplicationContext(),NotificationReceiverActivity.class); intent1.addCategory(Intent.CATEGORY_LAUNCHER); final ComponentName cn = new ComponentName(
"com.example.schedulemapp",
"com.example.schedulemapp.SharedPreferencesActivity"); intent1.setComponent(cn); intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
System.out.println("before");
startActivity( intent1);
System.out.println("after"); long recdmsg = Long.parseLong(messagerecvd);
Notification notification = new Notification(
R.drawable.ic_launcher, "You have a task scheduled
11
recdmsg); intent1.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingNotificationIntent = PendingIntent
.getActivity(this.getApplicationContext(), 0, intent1,
HH:mm");
PendingIntent.FLAG_UPDATE_CURRENT); notification.flags |= Notification.FLAG_AUTO_CANCEL;
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd,yyyy
Date resultdate = new Date(System.currentTimeMillis());
Date recvddate = new Date(recdmsg);
System.out.println(" A" + sdf.format(resultdate)
+ "currernt timestamp" + System.currentTimeMillis());
System.out.println(" B" + sdf.format(recvddate) + "recvd timestamp"
+ recdmsg); notification.setLatestEventInfo(this.getApplicationContext(),
"AlarmManagerDemo", "Schedule Event", pendingNotificationIntent); mManager.notify(0, notification);
}
} catch (Exception e) {
}
}
@Override public void onDestroy() {
}
System.out.println("DSTRY");
// TODO Auto-generated method stub super.onDestroy();
2.4 Schedule Alarm
12
With references to [36][37], this function helps in scheduling the alarm manager to verify whether the any new calendar is event is created for the student. In the example code mentioned below the service is checked for every hour for the new event in the Google
13 calendar. Since the schedule creation is a continuous event, the alarm set is of type
Alarm.SetRepeating.
Code snippet explanation:
Alarm manager is used to schedule the alarm. This helps to save the battery life. In the below code snippet we are creating a pending Intent alarm which trigger after every one hour. That means for every one hour our application invokes the AlarmReceiver class. public void scheduleAlarm () {
// Construct an intent that will execute the AlarmReceiver
Intent intent = new Intent (getApplicationContext (), AlarmReceiver. Class);
// Will be triggered when the alarm goes off
final PendingIntent pIntent = PendingIntent.getBroadcast(this, 12345,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
long firstMillis = System.currentTimeMillis();
int intervalMillis = 60*60*1000; // 1 hour
AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstMillis, intervalMillis, pIntent);
}
2.5 Cancel Alarm
With references to [36][37], alarmManager class provides a method “Cancel” to stop creating the alarm events.
Code snippet explanation:
Alarm manager is used to schedule the alarm.. In the below code snippet we are creating a pending Intent alarm which trigger after every one hour. A call to the cancel function of the alarm manager will cancel the scheduled pending alarm.
public void cancelAlarm() {
Intent intent = new Intent (getApplicationContext (), AlarmReceiver. Class);
final PendingIntent pIntent = PendingIntent.getBroadcast(this, 12345,intent,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager) this
.getSystemService(Context.ALARM_SERVICE);
alarm. Cancel(pIntent);
}
2.6 Android Manifest
14
As mentioned in [9], Android Manifest is a repository which contains all the information related to the application. The activity properties are mentioned here. The following are the different types of properties of android used in this project. Permission levels are also set to the application using the Manifest file.
2.6.1 android: exported
Whether or not components of other applications can invoke the service or interact with it
— "true" if they can, and "false" if not. When the value is "false", only components of the same application or applications with the same user ID can start the service or bind to it.
The default value depends on whether the service contains intent filters. The absence of any filters means that it can be invoked only by specifying its exact class name. This implies that the service is intended only for application-internal use (since others would not know the class name). So in this case, the default value is "false". On the other hand, the presence of at least one filter implies that the service is intended for external use, so the default value is "true".
15
2.6.2 android: name
The name of the Service subclass that implements the service. This should be a fully qualified class name (such as, "com.example.project.RoomService"). However, as a shorthand, if the first character of the name is a period (for example, ".RoomService"), it is appended to the package name specified in the <manifest> element.
Once you publish your application, you should not change this name (unless you've set android:exported="false").
There is no default. The name must be specified.
2.6.3 android: process
The name of the process where the service is to run. Normally, all components of an application run in the default process created for the application. It has the same name as the application package. The<application> element's process attribute can set a different default for all components. But component can override the default with its own process attribute, allowing you to spread your application across multiple processes.
If the name assigned to this attribute begins with a colon (':'), a new process, private to the application, is created when it's needed and the service runs in that process. If the process name begins with a lowercase character, the service will run in a global process of that name, provided that it has permission to do so. This allows components in different applications to share a process, reducing resource usage.
16
2.6.4 android: icon
An icon representing the service. This attribute must be set as a reference to a drawable resource containing the image definition. If it is not set, the icon specified for the application as a whole is used instead (see the <application> element's icon attribute).
The service's icon — whether set here or by the <application> element — is also the default icon for all the service's intent filters (see the <intent-filter> element's icon attribute).
2.6.5 android: label
A name for the service that can be displayed to users. If this attribute is not set, the label set for the application as a whole is used instead (see the <application> element's label attribute).
The service's label — whether set here or by the <application> element — is also the default label for all the service's intent filters (see the <intent-filter> element's label attribute).
The label should be set as a reference to a string resource, so that it can be localized like other strings in the user interface. However, as a convenience while you're developing the application, it can also be set as a raw string.
17
2.6.6 android: theme
A reference to a style resource defining a default theme for all activities in the application. Individual activities can override the default by setting their own theme attributes.
<application
android:allowBackup="true"
android: icon="@drawable/ic_launcher"
android: label="@string/app_name"
android: theme="@style/AppTheme" >
<activity
android: name="com.example.ScheduleMapp.MainActivity"
android: label="@string/app_name" >
<intent-filter>
<action
android: name="com.example.ScheduleMapp.MainActivity" />
<category
android: name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android: name="com.example.ScheduleMapp.TestRecieverActivity"
android: label="@string/app_name" >
<intent-filter>
<action android: name="android.intent.action.MAIN" />
<category android: name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android: name="com.example.ScheduleMapp.NextActivity"
android: label="Next Screen">
</activity>
<activity
android:name="com.example.ScheduleMapp.NotificationReceiverActivity"
android: label="Next Screen">
</activity>
18
<service
android: name=".AlarmService"
android: enabled="true"
/>
<receiver android:name=".Receiver"
android: enabled="true"
android: process=":remote"
/>
</application><uses-permission
android:name="android.permission.WAKE_LOCK" />
<uses-permission
android:name="android.permission.READ_CALENDAR">
</uses-permission>
<uses-permission
android:name="android.permission.WRITE_CALENDAR">
</uses-permission>
In the android manifest file, uses permission enables the application to be capable of accessing the external applications installed on the device like Skype, Internet, Calendar etc., and also access the settings of the devices. The activity with Launcher is the starting application which is like home page. All the other activities are default can be invoked after the start of the application.
2.7 Stop Clock
Code snippet explanation:
With reference to [38], the below code is based uses runnable method to perform multi task. As the clock needs to be incremented continuously this task is done using runnable interface, which helps the user to focus on his task. The below stop clock is configured for an interval of one min. Activities are planned for on start, pause activity. When the user clicks on start activity, the stop clock retrieves the system time for references. Since the system time changes continuously, runnable interface handles the task of updating the
UI, for continuous change of seconds and minutes. In the code below, the stop clock is
19 stopped when the minutes is updated to one by run method. Pause activity will save the updated seconds and minutes and stop the run method invocation. public class Stop_Clock_Test extends Activity { private TextView textTimer; private Button startActivityButton; private Button pauseActivityButton; private long startTime = 0L; private Handler ActivityHandler = new Handler(); long timeInMillies = 0L; long timeSwap = 0L; long finalTime = 0L;
@SuppressLint("NewApi")
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_stop__clock__test); textTimer = (TextView) findViewById(R.id.textTimer);
}); startActivityButton = (Button) findViewById(R.id.btnStart); startActivityButton.setOnClickListener(new View.OnClickListener() {
} public void onClick(View view) { startTime = SystemClock.uptimeMillis();
ActivityHandler.postDelayed(updateTimerMethod, 0);
}); pauseActivityButton = (Button) findViewById(R.id.btnPause); pauseActivityButton.setOnClickListener(new View.OnClickListener() {
} public void onClick(View view) { timeSwap += timeInMillies;
ActivityHandler.removeCallbacks(updateTimerMethod);
} private Runnable updateTimerMethod = new Runnable() { public void run() { timeInMillies = SystemClock.uptimeMillis() - startTime; finalTime = timeSwap + timeInMillies;
20
Toast.LENGTH_SHORT) int seconds = (int) (finalTime / 1000); int minutes = seconds / 60; seconds = seconds % 60; int milliseconds = (int) (finalTime % 1000); if (minutes > 1) {
Toast.makeText(getApplicationContext(),
"You have completed the task",
} else {
}
.show();
// ActivityHandler.removeCallbacks(this); textTimer.setText("" + minutes + ":"
+ String.format("%02d", seconds) + ":"
+ String.format("%03d", milliseconds));
ActivityHandler.postDelayed(this, 0);
}
};
2.8 Reading Calendar
Code snippet explanation:
With reference to [11-20], the below code snippet is required to read the calendar event which is created during the create schedule in the application. The build version is considered because the parsing of Uri method is different for the old version of android.
This code is required for the alarm creation to notify the user about the scheduled tasks.
The background process will be continuously running this task by reading the calendar events created. Whenever this function is called the pre-set alarm will be cancelled and new alarms are created. This is to prevent from any redundant alarm creation. The pending Intent is used to cancel all the alarms which are pending to be notified to the user. Cursor is used to parse the events retrieved. While parsing the application, the
21 cursor retrieves the required data mentioned in the query of the content resolver. These events retrieved are a high level of scheduled events, meaning that for every recurrence events we created a single entity is created. To handle all the tasks scheduled in the events we need to parse using instances. This instances should be appended with the when data between start and end to retrieve the list of tasks. Once the calendar instances for the given time period is read into the event cursor, event cursor is parsed to set the calendar event notification which is passed as a intent extra to the notification receiver class.
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
Context context = getApplicationContext();
ContentResolver contentResolver = context.getContentResolver();
Uri l_eventUri; if (Build.VERSION.SDK_INT >= 8) { l_eventUri = Uri.parse("content://com.android.calendar/events");
} else {
} l_eventUri = Uri.parse("content://calendar/events"); int counter = 0; int count = 0;
Uri uri = Uri. Parse("content://com.android.calendar/events");
AlarmManager alarmManager2 = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
Intent updateServiceIntent = new Intent(context, MyReceiver.class);
PendingIntent pendingUpdateIntent = PendingIntent.getService(context,
// Cancel alarms
0, updateServiceIntent, 0); try { alarmManager2.cancel(pendingUpdateIntent);
} catch (Exception e) {
}
// Log.e (TAG, “AlarmManager update was not canceled. " + //
// e.toString());
Cursor cursor = contentResolver. Query(
"ownerAccount" },
Uri.parse("content://com.android.calendar/events"), new String[] { "calendar_id", "title", "description", null, null, null);
"dtstart", "dtend", "eventLocation",
HashSet<String> calendarIds = new HashSet<String>(); try { cursor.count loop");
System.out.println("Count=" + cursor.getCount()); if (cursor.getCount() > 0) {
// System.out.println("the control is just inside of the while (cursor.moveToNext()) {
String _id = cursor.getString(0);
// String displayName = cursor.getString(1);
// Boolean selected = !cursor.getString(2).equals("0"); if
(cursor.getString(6).equals("holla.raghu@gmail.com")) { calendarIds.add(_id);
}
}
}
} catch (AssertionError ex) { ex.printStackTrace();
System.out.println("Id: " + _id + "Title "
+ cursor.getString(6));
} catch (Exception e) { e.printStackTrace();
}
// For each calendar, display all the events from the previous week to
// the end of next week. for (String id : calendarIds) {
Uri.Builder builder = Uri.parse(
"content://com.android.calendar/instances/when")
.buildUpon();
22
23 long now = new Date().getTime();
ContentUris.appendId(builder, now - DateUtils.WEEK_IN_MILLIS);
ContentUris.appendId(builder, now + DateUtils.WEEK_IN_MILLIS);
Cursor eventCursor = contentResolver.query(builder.build(), new String[] { "title", "begin", "end", "allDay" },
"CALENDAR_ID='" + id + "'", null, null); if (eventCursor.getCount() > 0) { if (eventCursor.moveToFirst()) { do { final String title = eventCursor.getString(0); final Date begin = new
Date(eventCursor.getLong(1));
Date(eventCursor.getLong(2));
!eventCursor.getString(3) final Date end = new final Boolean allDay =
.equals("0"); begin.getMonth()); begin.getDate()); begin.getHours()); begin.getMinutes());
Calendar calendar = Calendar.getInstance(); int year = begin.getYear() + 1900; calendar.set(Calendar. MONTH, calendar.set(Calendar.YEAR, year); calendar.set(Calendar.DAY_OF_MONTH, int hour = begin.getHours(); calendar.set(Calendar.HOUR, calendar.set(Calendar.MINUTE, begin.getSeconds());
Calendar.AM); calendar.set(Calendar.SECOND, calendar.set(Calendar.AM_PM, Calendar.AM); if (hour < 12) { calendar.set(Calendar.HOUR, hour); calendar.set(Calendar.AM_PM,
} else if (hour == 12) { calendar.set(Calendar.HOUR, hour);
Calendar.PM);
Calendar.PM);
} else {
} calendar.set(Calendar.AM_PM, hour = hour - 12; calendar.set(Calendar.HOUR, hour); calendar.set(Calendar.AM_PM, long temp = calendar.getTimeInMillis(); count++;
SimpleDateFormat(
Date(System.currentTimeMillis());
Intent(MainActivity.this,
SimpleDateFormat sdf = new
"MMM dd,yyyy HH:mm");
Date resultdate = new
Date recvddate = new Date(temp);
System.out.println("Date " + recvddate);
Intent myIntent = new
MyReceiver.class);
Bundle bundle = new Bundle(); bundle.putString("EXTRA",
"" + calendar.getTimeInMillis()); myIntent, myIntent.putExtras(bundle); pendingIntent = PendingIntent.getBroadcast(
MainActivity.this, count,
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager =
(AlarmManager) getSystemService(ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, pendingIntent); calendar.getTimeInMillis(),
} while (eventCursor.moveToNext());
}
} break;
} finish();
}
24
25
3.1 Login Screen
Login with User Name and Password
From the references [23-24], shared preference is used to store the session credentials. If the user closes the application and re-opens the application, shared preferences will not ask the user login credentials, unless logged out of the application.
Code snippet explanation:
Shared preference is a key value pair. When the user logs in, the user credentials are saved in the editor which is the dictionary for saving the session variables. This use of shared preference is preferred only when data to be saved are very limited. For large data, use of database is preferred. In the editor, username and password are saved. When the application resumes, the android verifies for the data from the shared preferences, if the username and password matches then application is redirected to home page rather than to the login.
The intent instance is used for navigation. When the password is matched start activity method invokes ScheduleApp.class.
public void login(View view){
Editor editor = sharedpreferences.edit();
String u = username.getText().toString();
String p = password.getText().toString();
editor.putString(name, u);
editor.putString(password, p);
editor.commit();
}
protected void onResume() {
sharedpreferences=getSharedPreferences(MyPREFERENCES,
26
Context.MODE_PRIVATE);
String sharedusername = (sharedpreferences.getString(name, ""));
if (sharedpreferences.contains(name))
{
if(sharedpreferences.contains(password)){
if(sharedusername.equalsIgnoreCase("Admin")){
Intent i = new Intent(this,ScheduleApp.class);
startActivity(i);
}
else
{
}
}
}
Intent i = new Intent(this,StudentStartScreen.class);
startActivity(i);
Register Screen: If the user doesn’t have a valid user name, he needs to register through this button. This registration process is only for students. Instructor registration will be done by the Admin.
3.2 Forgot Password
Student can recover the Password by clicking this button.
The application view is divided into 3 fragments, namely Admin Fragment, Notification
Fragment and View Fragment.
3.3 Menu bar
has the options for
Go to school website o Functionality: Clicking this button will navigate to the school home page.
27
Edit personal info o This feature is useful for the student to update his credentials. “Register” screen will not collect all the necessary information. o Functionality: Update the user information.
Logout o Exit from the application. When the user logs in, need to enter the login credentials. o Functionality: User session will be expired.
Settings o This option provides the user to stop updating the calendar notification, by cancelling the alarm.
Code snippet explanation:
The Menu option provides the extra functionalities to navigate. In this application, the menu options provides the options to “Go to school website” , “Edit Personal Info”,
“logout” , “Settings”. All these items are listed in the menu. The menu inflater provides the User Interface (UI) for the application. When the user clicks on the item in the list menu, on click action listener performs the related actions for the selected option. public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
} getMenuInflater().inflate(R.menu.activity_schedule_app, menu); return true;
Functionality: Additional functionalities related to configuration details are provided.
28
Fragments: Fragments are useful to split the screen, to provide different features. Use of fragments helps to create multiple activities in a single activity.
Code snippet explanation:
With reference to [26], Action Bar class instance is used to create the fragments. Tab () function is used to create new fragments. In this application, three fragments are created.
When the fragment is clicked, application verifies for the tab position, and executes the related functionalities. Bundle [27-32] is useful to transfer data between activities. All the data transfer details are put in the data bundle instance. Since the fragment functionality is almost similar to the activity, the data send and retrieve also behaves in the same way, only exception is the syntax. set Arguments(bundle data) is used to bind the data bundle to the fragment activity.
ActionBar bar = getActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
for (int i=1; i <= 3; i++) {
Tab tab = bar.newTab(); if(i==1)
{ tab.setText("Admin"); if(tab.getPosition()==0)
{
} }
} if (f == null) { tf = new TabFragment();
}
Bundle data = new Bundle(); data.putInt("idx", tab.getPosition()); tf.setArguments(data); fragList.add(tf); else tf = (TabFragment) f; ft.replace(android.R.id.content, tf);
3.4 Admin Fragment
29
Figure 2. Admin Fragment
This fragment provides crucial features for the Admin/Instructor to perform all the functionalities required for the application.
If user is logged as Admin/ instructor then Admin fragment along with slide window panel will be visible.
The following are the functionalities provided in the Admin fragment
3.4.1 Add Subjects
This functionality is useful to add new subjects to the course list.
30
Figure 3. Add Subjects
Steps to use:
Choose the Add button next to the Subjects
Enter the subject Name
Enter the subject Type
Choose the Instructor from the drop-down box.
Enter the subject group mailing id: this is useful for sending mails to the group associated with the subject.
Enter the subject Description
Press Save Button.
3.4.2 Add Instructors
This functionality is useful to add new instructor to the school
31
Figure 4. Add Instructors
Steps to use:
Choose the Add button next to the Instructor
Enter the Instructor First Name
Enter the Instructor Last Name
Enter the Instructor Email Id
Enter the Instructor Phone Number
Enter the Instructor Address
32
Enter the Instructor City
Press Save Button.
Click on Next Button, to continue adding more instructors.
Click on Prev Button, to update or view the details of instructor saved.
3.4.3 Add Schedule
This functionality is associated with creating events in the Google Calendar of both
Admin/Instructor along with the students who had enrolled to the course. This creation of calendar events will be used by the system alarm notification functionality which is bind with reading calendar events.
Code snippet explanation:
Spinner is used for drop-down [33]. Scheduletype is an array of items. These items are bind to the spinner instance by using data adapter.
The Calendar event creation is most important for the application. This can be considered as the core implementation which drives the rest of the application implementation. From references [11-20], calendar event is created using the calendar intent. Action_edit refers to all the installed application on the device which the feature of edit. The calendar instances have this type of feature. The intent is set with the event type and necessary data is set using the calendar properties like title, calendar_id, description etc. Calendar recurrence events are created with Rrule, customized based on the application requirement like every day, every Tuesday, Thursday etc. Once all the required data is set, the start activity function is called which opens the calendar instance.
33
Spinner spinner2 = (Spinner) findViewById(R.id.spinnerSchedule);
Spinner spinnersubjects = (Spinner) findViewById(R.id.spinnerSubjects);
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, scheduletype); dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_
item); spinner2.setAdapter(dataAdapter);
Intent l_intent = new Intent(Intent.ACTION_EDIT); l_intent.setType("vnd.android.cursor.item/event"); l_intent.putExtra("calendar_id", calID); l_intent.putExtra("title", title); l_intent.putExtra("description", description); l_intent.putExtra("eventLocation", "@home"); l_intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, startMillis); l_intent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME,
{ endMillis);
System.out.println("Rrule"+rruleexp);
l_intent.putExtra(CalendarContract.Events.RRULE, rruleexp);
String sendingmail=""; if (strguests.length>0) allow overlap of scheduling sendingmail=strguests[0];
}
for(int i=1; i<strguests.length; i++) { sendingmail=sendingmail+ ", "+strguests[i];
} l_intent.putExtra(
Intent.EXTRA_EMAIL,
sendingmail);
//0~ opaque, no timing conflict is allowed; 1~ transparency, l_intent.putExtra("transparency", 0);
//0~ false; 1~ true l_intent.putExtra("hasAlarm", 1); try { startActivity(l_intent);
34
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "Sorry, no compatible calendar is found!", Toast.LENGTH_LONG).show();
}
Figure 5. Add Schedule
Steps to use:
Choose the Add button next to the Schedule
Choose the Title from the drop down ( alias of subject name)
Choose the Guests from the drop down (can send to individual student, group, multiple groups).
35
Choose the Start Day Date. This is a Date picker dialog box. Provides information when to start the schedule.
Choose the Start Time and End Time of the schedule. This is a Time picker dialog box.
Choose the End Day Date. This is a Date picker dialog box. Provides information when to end the schedule.
Choose the Schedule from the drop down. This provides the information related to the frequency of the schedule events (recurrence rules can be selected here) like Weekly,
Weekend, MWF(Monday, Wednesday, Friday) etc..,
Based on the selection of Title, Description will be auto filled.
Click on”Ok” button to save the created calendar.
User will be re-directed to the Google calendar, Click on “Done” if all the data filled is correct.
Calendar Event Notification is sent to all the users listed in the Guests.
When recipient accepts the event request, schedule is created in his/her calendar.
Click on “Cancel” button to cancel the creation of schedule.
Click on “Create Tasks”
Auto- Fill fields in this screen are: o Instructor Name o Subject o start time and end time for the task
Enter the Topic.
Enter the Objectives.
Enter the Details of the task.
36
Figure 6. Create Tasks
Choose the Date of the task.
Choose the start time and end time for the task, if required to be changed.
Click on Save Button.
Click on Next Button, to continue adding more tasks.
Click on Prev Button, to update or view the details of instructor saved.
37
3.4.4 Edit/ View Schedule
This functionality is associated with editing/ modifying events created in the Google
Calendar of both Admin/Instructor along with the students who had enrolled to the course. This also updates calendar events used by the system alarm notification functionality which is bind with reading calendar events.
Code snippet explanation:
Dialog box [39] is a pop-up screen. Dialog box pops up when user chooses the calendar event. Dialog class instance is used to provide this feature. The layout of the dialog is set in taskeditorview xml. The data from the UI elements are retrieved using dialog.
FindViewById (element id). Dialog by default provides cancel functionality when the user clicks outside the Dialog UI. When any dialog button is clicked, action on click listener item is invoked and it performs the functionality written in code.
Update to the calendar event [11-20] is also required when the user wants to edit calendar events. This function requires the content resolver to retrieve the calendar id and the corresponding event id for the calendar event for which the user wants to update the event. All the required methods are in the content resolver and in the content Uris classes.
When the event id is retrieved, the data is package with the content Uris class and the entire set is bind to update function. If the row count returned is greater than 0, then the event of the calendar is updated.
Delete Calendar works similar to update calendar event.
38 final Dialog dialog = new Dialog(TestListViewActivity.this); dialog.setContentView(R.layout.taskeditorview);
TextView descriptionView = (TextView) dialog
.findViewById(R.id.Description); dialog.setCancelable(true); dialog.setTitle(newsData.getTopic()); dialogButton2.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
// dialog.dismiss();
});
}
// View.VISIBLE lsy.setVisibility(View.VISIBLE); dialogButton.setVisibility(View.VISIBLE); updateUri = ContentUris.withAppendedId(Events.CONTENT_URI, eventId); int rows = resolver.update(updateUri, values, null, null);
Log.i("TAG", "Rows updated: " + rows); if(rows==1)
Toast.makeText(getApplicationContext(),
Toast.LENGTH_SHORT).show();
"Update Successful",
}
ContentResolver resolver = getContentResolver();
Cursor cursor;
if (android.os.Build.VERSION.SDK_INT <= 7) { //up-to Android 2.1
cursor = resolver.query(eventsUri, new String[]{ "_id", "title","dtstart",
"dtend" }, "Calendars._id=" + 1 +" and _id="+event_id, null, null);
} else {
cursor = resolver.query(eventsUri, new String[]{ "_id", "title", "dtstart",
"dtend","rrule" }, "calendar_id=" + 1+" and _id="+event_id, null, null);
}
while(cursor.moveToNext()) { event_id), null, null);
resolver.delete(ContentUris.withAppendedId(eventsUri,
}
cursor.close();
39
Figure 7. Edit/ View Schedule
Steps to use:
Choose the Edit button next to the Schedule.
Choose the Schedule Date. Start date and End date of the schedule created.
Click on the schedule which needs to be updated/ deleted.
Choose the Activity Dialog box pops up
40
Figure 8. Activity Dialog box
View tasks button will display the list of tasks associated with the corresponding schedule created earlier. o Choose the Course ID drop down box o Choose the Range of the tasks between dates start and end o List of tasks associated with the schedule will be displayed o Click on the task, if the task needs to be updated. o Click on Edit button. o Edit the required fields and Click on save button.
Delete button will delete the schedule created.
Update button will redirect to schedule update screen
41
Figure 9. View Tasks
42
Figure 10. Update Schedule o Update the editable fields which will be reflected in the Google calendar event notification created.
Choose “Done” button when any of the above mentioned operations like view, update or delete is completed.
43
3.4.5 Enrollment
This functionality is useful to enroll the students to the course/subject.
Admin/Instructor can add/delete the students from courses
Code snippet explanation:
Search feature [40] reduces the pain of searching for the student. Just by typing the user, auto-complete feature helps to identify the student easily. The auto-complete functionality is provided by customizing the base adapter [34]. Text Watcher is the property which inputs the letters from the textbox. When the user enters the letter, adapter which contains the list of students is filtered. inputSearch.addTextChangedListener(new TextWatcher() {
@Override public void onTextChanged(CharSequence cs, int arg1, int arg2,int arg3) {
//When user changed the Text adapter.getFilter().filter(cs);
}
@Override public void beforeTextChanged(CharSequence arg0, int arg1, arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override public void afterTextChanged(Editable arg0) {
}
});
}
// TODO Auto-generated method stub
44
Figure 11. Enrollment
45
Figure 12. Choose Student
46
Figure 13. Enrolling for the subject
Steps to use:
Choose the Add button next to the Enrollment.
Choose the “Search Students” which helps search easier.
Click on any student.
Subjects for which the student has enrolled will be displayed by checkbox against it.
Subjects are displayed alphabetically.
Admin/Instructor can uncheck/ check the subjects displayed.
Click On “Save”. This will enroll the students to the course.
47
3.4.6 Grading
This functionality is useful to grade the student based on the course. The Instructor chooses the subject and list of students enrolled for the course will be displayed. All the tasks which require Instructor evaluation is displayed. If the task is already rated a dialog message is displayed.
Figure 14. Grading, choose the course and student
48
Figure 15. Grade the student performance by task
Steps to use:
Choose the Add button next to the Grading.
Choose the Course ID drop down box.
Students enrolled for the subject will be displayed.
Click on any student, so the pending tasks will be displayed.
Choose the Rate the student drop down box ( 3 ratings were provided like Good,
Poor, Satisfactory)
Click On “Done”. This will grade the student for a particular task of the course.
49
3.5 Slide Window Panel
On the top left corner of the Application, there is a button which shows the Sliding window.
Code snippet explanation:
Slide window panel, reference from [27] is additional add on which gives benefit of additional functionality with one click. To implement this functionality an array of items, that need to be displayed are created in the xml. Here the array.xml contains the array of navigation drawer items. The items can also be associated with image. The menu icons are obtained from array.xml where the icons are saved. Navigation drawer should customize the base adapter to display title and icon features. The customized adapter is
NavDrawerListAdapter. When the application is loaded, these features are set. On click on Navigation list menu, drawer toggle will open. The toggle is associated with two functionalities close and open. navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
// nav drawer icons from resources navMenuIcons = getResources()
.obtainTypedArray(R.array.nav_drawer_icons); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerList = (ListView) findViewById(R.id.list_slidermenu); navDrawerItems = new ArrayList<NavDrawerItem>();
// adding nav drawer items to array navDrawerItems.add(new navMenuIcons.getResourceId(0, -1)));
NavDrawerItem(navMenuTitles[0], adapter = new NavDrawerListAdapter(getApplicationContext(),
50 accessibility navDrawerItems); mDrawerList.setAdapter(adapter);
// enabling action bar app icon and behaving it as toggle button getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, //nav menu toggle icon
R.string.app_name, // nav drawer open - description for
R.string.app_name // nav drawer close - description for accessibility
) { public void onDrawerClosed(View view) { getActionBar().setTitle(mTitle);
}
// calling onPrepareOptionsMenu() to show action bar icons invalidateOptionsMenu(); public void onDrawerOpened(View drawerView) { getActionBar().setTitle(mDrawerTitle);
}
// calling onPrepareOptionsMenu() to hide action bar icons invalidateOptionsMenu();
}; mDrawerLayout.setDrawerListener(mDrawerToggle);
Home
Click on this option, Redirects to the start screen of the application.
Create Task
Create Schedule
Click on this option, Redirects to the Schedule creation screen of the application.
Video Call
Click on this option, Redirects to the video call screen.
51
Figure 16. Sliding Window Panel
52
Figure 17. Video Conference
Steps to use:
Choose the Subject.
Choose the Student.
Click on Call button.
Application will be redirected to Skype video calling.
Once the call is finished, press on back button.
53
View Calendar
Click on this option, Redirects to the Google calendar app installed in the device.
This helps for the user to know the list of tasks that are planned and tasks which are attended.
Figure 18. Viewing Calendar Tasks
54
3.6 Notification Fragment
This fragment is very useful for sending emails to the instructor as well members of the groups. Tap on Notification tab. This tab has access for both Admin/Instructor as well for the students.
Figure 19. Sending Messages
Steps to use:
Choose the “To” drop down box. This displays the group alias mail
Id. Choose one or many from the drop down list.
Enter the Subject.
55
Enter the Message.
Click on Send button. Email will be sent to all the members mentioned in the group.
Click on Cancel button, to discard the mail.
3.7 View Fragment
This fragment is an interface to view. Tap on View tab. This tab has access for both
Admin/Instructor as well for the students.
Figure 20. View Fragment
56
3.7.1 Subjects
User can view list of subjects offered in the school. Get details of the subjects, such as course description, start date, end date, start time, end time etc.
Steps to use:
Choose the search button, next to the Subjects.
List of subjects offered will be displayed
Choose from the search subject, Enter the subject name.
Click on the subject.
Information related to the subject will be displayed.
3.7.2 Instructors
User can view list of Instructors in the school. Get details of the instructor, such as first name, last name, email Id, phone number, address, subjects taught etc.,
Steps to use:
Choose the search button, next to the Instructors.
List of instructors will be displayed
Choose from the search instructor, Enter the instructor name.
Click on the instructor.
Information related to the instructor will be displayed.
3.7.3 Students
User can view list of students in the school. Get details of the students, such as first name, last name, email Id, phone number, address, courses enrolled etc.,
57
Steps to use:
Choose the search button, next to the Students.
List of students will be displayed
Choose from the search student, Enter the student name.
Click on the student.
Information related to the student will be displayed.
3.7.4 Tasks
User can view list of tasks scheduled for them in the school.
3.7.5 Grades
User can view their grades for the tasks finished.
Additional functionalities like notification, stop clock, start screen on task scheduled, self-grading back ground process for verifying updates to the calendar events etc.., are also provided.
Notification: At the start of scheduled task, alarm notification is shown in the top left of the screen. Once the student drags the notifications, brief explanation of the task will be displayed. When the user chooses the notification, start screen on task scheduled activity will be displayed. This screen will have information related to the subject name, task description, objective, start stop clock and pause stop clock button. Once the student finishes the task, click on Task Completed button, this will redirect to self-rating the task.
Back ground process for verifying updates to the calendar events is done as a new application, which schedules the alarm notification for every hour.
58
This application is designed in taking valuable suggestions from the Professor, who has gathered the requirements after discussing with Instructors. These suggestions collected are the requirements for the project. The students who use this app, has an added advantage to make their career smart. This application helps the students to be punctual and follow the activities scheduled. All the basic requirements such as enrolling to the subject, video-conferencing during the class scheduled, exchanging messaging for better understanding, view schedules and tasks (as the application is a Google calendar based, provides the benefits and flexibility of managing the alarms and notifications easily) are provided in this application.
The main purpose of this project is to provide a platform which can help the instructor to sharpen the skills of the student. Mobile application helps to drive this purpose. Android is default platform which any one prefers because of its low-cost and easy to develop an application, as well as easy to use. The application is designed in such a way that the student can get the required work done by a single touch. This single touch helps the young students to easily use and perform the operations designed in the application.
Proper utilization of this application in a school will make the student excel both in academics and also in extra-circular activities. This application can be used in all the
Android supported devices (tablets, smart-phones).
59
1.
Android Notifications Example http://examples.javacodegeeks.com/android/core/ui/notifications/android-notificationsexample
2.
Exercise: Define and consume local service http://www.vogella.com/articles/AndroidServices/article.html#exercise_bindlocalservice
3.
Exploring a Wake Lock Example http://www.netmite.com/android/mydroid/development/pdk/docs/power_management.html# androidPowerWakeLockExample
4.
Wake Locks Android Example http://androidbite.blogspot.com/2013/02/wake-locks-android-example.html
5.
Use Android's AlarmManager to schedule an event http://www.techrepublic.com/blog/software-engineer/use-androids-alarmmanager-toschedule-an-event/
6.
Android AlarmManager tutorial http://www.javacodegeeks.com/2012/09/android-alarmmanager-tutorial.html
7.
Android Alarm Manager to Start Service every hour http://khurramitdeveloper.blogspot.com/2013/06/android-alarm-manager-to-start-service.html
8.
Android demo for services and notifications https://github.com/thecodepath/android-services-demo
9.
AlarmManager Class Overview http://developer.android.com/reference/android/app/AlarmManager.html
10.
How to make a Skype Audio/Video call and Chat through intent in Android http://www.limbaniandroid.com/2014/01/how-to-make-skype-audiovideo-call-and.html
11.
Cannot read recurring events from android calendar programmatically http://stackoverflow.com/questions/7130025/cannot-read-recurring-events-from-androidcalendar-programmatically
60
12.
Delete calendar entries http://stackoverflow.com/questions/5806174/delete-calendar-entries
13.
How to read and edit Android calendar events?
http://stackoverflow.com/questions/7859005/how-to-read-and-edit-android-calendar-eventsusing-the-new-android-4-0-ice-cream
14.
Calendar Provider Class Overview http://developer.android.com/guide/topics/providers/calendar-provider.html
15.
How to find and select events calendar in Android? http://stackoverflow.com/questions/6910010/how-to-find-and-select-events-calendar-inandroid
16.
How to add events to native calendar App in Android http://sureshdotariya.blogspot.com/2013/03/how-to-add-events-to-native-calendar.html
17.
CalenderView Example http://www.edumobile.org/android/android-development/calenderview-example/
18.
Calendar and Settings
61 http://www.androidpolice.com/2012/08/28/getting-to-know-android-4-1-part-5-calendar-andsettings/#calendar
19.
RecurrenceSetTest.java https://android.googlesource.com/platform/frameworks/opt/calendar/+/icsmr1/tests/src/com/android/calendarcommon/RecurrenceSetTest.java
20.
Android Essentials: Adding Events to the User’s Calendar http://mobile.tutsplus.com/tutorials/android/android-essentials-adding-events-to-theuser%E2%80%99s-calendar/
21.
android.os.NetworkOnMainThreadException http://android-er.blogspot.in/2012/04/androidosnetworkonmainthreadexception.html
22.
Android Sliding Menu using Navigation Drawer http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/
23.
Android Session Management Tutorial http://www.tutorialspoint.com/android/android_session_management.htm
24.
Android Shared Preferences Tutorial http://www.tutorialspoint.com/android/android_shared_preferences.htm
25.
Android Sending Email http://www.tutorialspoint.com/android/android_sending_email.htm
26.
Android Fragments http://www.tutorialspoint.com/android/android_fragments.htm
27.
Android Programming Tutorial http://www.tutorialspoint.com/android
28.
Android Programming Tutorial http://www.androidhive.info
29.
Introduction to Android http://developer.android.com/guide
30.
Android Development Tutorials about development for Android. http://www.vogella.com/tutorials/android.html
31.
Android Video Tutorial http://www.newthinktank.com/videos/android-video-tutorial/
32.
Android Developers Blog http://android-developers.blogspot.com/
33.
Spinners http://developer.android.com/guide/topics/ui/controls/spinner.html
34.
Android Custom List View Items “Row” http://hmkcode.com/android-custom-listview-items-row/
35.
Launching Different Applications from Android Activity using Intent http://ashwinrayaprolu.wordpress.com/2011/03/17/launching-different-applications-fromandroid-activity-using-intent/
36.
Scheduling Repeating Alarms http://developer.android.com/training/scheduling/alarms.html
37.
Creating an Intent Service https://github.com/thecodepath/android_guides/wiki/Starting-Background-Services
62
38.
Android Stopwatch Example http://androidituts.com/android-stopwatch-example/
39.
how to make a edit text box in a dialog http://stackoverflow.com/questions/18799216/how-to-make-a-edittext-box-in-a-dialog
40.
Android Adding Search Functionality to List View
http://www.androidhive.info/2012/09/android-adding-search-functionality-to-listview/
41.
How to show alphabetical letters on side of Android List View http://stackoverflow.com/questions/7129069/how-to-show-alphabetical-letters-on-side-ofandroid-listview
63