diff --git a/app/src/main/java/com/deitel/addressbook/AddEditContact.java b/app/src/main/java/com/deitel/addressbook/AddEditContact.java index e1deab8..6c76d1f 100644 --- a/app/src/main/java/com/deitel/addressbook/AddEditContact.java +++ b/app/src/main/java/com/deitel/addressbook/AddEditContact.java @@ -12,7 +12,15 @@ import android.widget.Button; import android.widget.EditText; -public class AddEditContact extends Activity { +import com.miyagilabs.voicer.InitListener; +import com.miyagilabs.voicer.Voicer; +import com.miyagilabs.voicer.VoicerFactory; +import com.miyagilabs.voicer.annotation.Voice; +import com.miyagilabs.voicer.tts.SpeakerException; +import com.miyagilabs.voicer.tts.VirtualAssistant; +import com.miyagilabs.voicer.widget.Toaster; + +public class AddEditContact extends Activity implements InitListener { private long rowID; // id of contact being edited, if any // EditTexts for contact information @@ -25,6 +33,11 @@ public class AddEditContact extends Activity { OnClickListener saveContactButtonClicked = new OnClickListener() { @Override public void onClick(View v) { + save(); + } // end method onClick + + @Voice(commands = "save") + private void save() { if (nameEditText.getText().length() != 0) { AsyncTask saveContactTask = new AsyncTask() { @@ -54,8 +67,9 @@ protected void onPostExecute(Object result) { builder.setPositiveButton(R.string.errorButton, null); builder.show(); // display the Dialog } // end else - } // end method onClick + } }; // end OnClickListener saveContactButtonClicked + private Voicer mVoicer; // called when the Activity is first started @Override @@ -87,6 +101,18 @@ public void onCreate(Bundle savedInstanceState) { saveContactButton.setOnClickListener(saveContactButtonClicked); } // end method onCreate + @Override + protected void onResume() { + VoicerFactory.fakeVoicer(this, this); + super.onResume(); + } + + @Override + protected void onPause() { + mVoicer.shutdown(); + super.onPause(); + } + // saves contact information to the database private void saveContact() { // get DatabaseConnector to interact with the SQLite database @@ -110,6 +136,23 @@ private void saveContact() { cityEditText.getText().toString()); } // end else } // end class saveContact + + @Override + public void onInit(Voicer voicer, int status) { + mVoicer = voicer; + runOnUiThread(new Runnable() { + @Override + public void run() { + mVoicer.addVoicerListener(new Toaster(AddEditContact.this)); + } + }); + try { + mVoicer.addVoicerListener(new VirtualAssistant(this)); + } catch (SpeakerException | InterruptedException e) { + e.printStackTrace(); + } + mVoicer.register(saveContactButtonClicked); + } } // end class AddEditContact diff --git a/app/src/main/java/com/deitel/addressbook/AddressBook.java b/app/src/main/java/com/deitel/addressbook/AddressBook.java index 2ecd297..b247f3e 100644 --- a/app/src/main/java/com/deitel/addressbook/AddressBook.java +++ b/app/src/main/java/com/deitel/addressbook/AddressBook.java @@ -17,7 +17,15 @@ import android.widget.ListView; import android.widget.SimpleCursorAdapter; -public class AddressBook extends ListActivity { +import com.miyagilabs.voicer.InitListener; +import com.miyagilabs.voicer.Voicer; +import com.miyagilabs.voicer.VoicerFactory; +import com.miyagilabs.voicer.annotation.Voice; +import com.miyagilabs.voicer.tts.SpeakerException; +import com.miyagilabs.voicer.tts.VirtualAssistant; +import com.miyagilabs.voicer.widget.Toaster; + +public class AddressBook extends ListActivity implements InitListener { public static final String ROW_ID = "row_id"; // Intent extra key // event listener that responds to the user touching a contact's name // in the ListView @@ -36,6 +44,7 @@ public void onItemClick(AdapterView arg0, View arg1, int arg2, }; // end viewContactListener private ListView contactListView; // the ListActivity's ListView private CursorAdapter contactAdapter; // adapter for ListView + private Voicer mVoicer; // called when the activity is first created @Override @@ -54,6 +63,7 @@ public void onCreate(Bundle savedInstanceState) { @Override protected void onResume() { + VoicerFactory.fakeVoicer(this, this); super.onResume(); // call super's onResume method // create new GetContactsTask and execute it @@ -62,6 +72,7 @@ protected void onResume() { @Override protected void onStop() { + mVoicer.shutdown(); Cursor cursor = contactAdapter.getCursor(); // get current Cursor if (cursor != null) { @@ -84,12 +95,29 @@ public boolean onCreateOptionsMenu(Menu menu) { // handle choice from options menu @Override public boolean onOptionsItemSelected(MenuItem item) { + addContact(); + return super.onOptionsItemSelected(item); // call super's method + } // end method onOptionsItemSelected + + @Voice(commands = "add contact") + private void addContact() { // create a new Intent to launch the AddEditContact Activity Intent addNewContact = new Intent(AddressBook.this, AddEditContact.class); startActivity(addNewContact); // start the AddEditContact Activity - return super.onOptionsItemSelected(item); // call super's method - } // end method onOptionsItemSelected + } + + @Override + public void onInit(Voicer voicer, int status) { + mVoicer = voicer; + mVoicer.addVoicerListener(new Toaster(this)); + try { + mVoicer.addVoicerListener(new VirtualAssistant(this)); + } catch (SpeakerException | InterruptedException e) { + e.printStackTrace(); + } + mVoicer.register(this); + } // performs database query outside GUI thread private class GetContactsTask extends AsyncTask { diff --git a/app/src/main/java/com/deitel/addressbook/ViewContact.java b/app/src/main/java/com/deitel/addressbook/ViewContact.java index 0ca5ad2..7b84363 100644 --- a/app/src/main/java/com/deitel/addressbook/ViewContact.java +++ b/app/src/main/java/com/deitel/addressbook/ViewContact.java @@ -14,18 +14,26 @@ import android.view.MenuItem; import android.widget.TextView; -public class ViewContact extends Activity { +import com.miyagilabs.voicer.InitListener; +import com.miyagilabs.voicer.Voicer; +import com.miyagilabs.voicer.VoicerFactory; +import com.miyagilabs.voicer.annotation.Voice; +import com.miyagilabs.voicer.tts.SpeakerException; +import com.miyagilabs.voicer.tts.VirtualAssistant; +import com.miyagilabs.voicer.widget.Toaster; + +public class ViewContact extends Activity implements InitListener { private long rowID; // selected contact's name private TextView nameTextView; // displays contact's name private TextView phoneTextView; // displays contact's phone private TextView emailTextView; // displays contact's email private TextView streetTextView; // displays contact's street private TextView cityTextView; // displays contact's city/state/zip + private Voicer mVoicer; // called when the activity is first created @Override public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); setContentView(R.layout.view_contact); @@ -44,12 +52,19 @@ public void onCreate(Bundle savedInstanceState) { // called when the activity is first created @Override protected void onResume() { + VoicerFactory.fakeVoicer(this, this); super.onResume(); // create new LoadContactTask and execute it new LoadContactTask().execute(rowID); } // end method onResume + @Override + protected void onPause() { + mVoicer.shutdown(); + super.onPause(); + } + // create the Activity's menu from a menu resource XML file @Override public boolean onCreateOptionsMenu(Menu menu) { @@ -65,18 +80,7 @@ public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) // switch based on selected MenuItem's ID { case R.id.editItem: - // create an Intent to launch the AddEditContact Activity - Intent addEditContact = - new Intent(this, AddEditContact.class); - - // pass the selected contact's data as extras with the Intent - addEditContact.putExtra(AddressBook.ROW_ID, rowID); - addEditContact.putExtra("name", nameTextView.getText()); - addEditContact.putExtra("phone", phoneTextView.getText()); - addEditContact.putExtra("email", emailTextView.getText()); - addEditContact.putExtra("street", streetTextView.getText()); - addEditContact.putExtra("city", cityTextView.getText()); - startActivity(addEditContact); // start the Activity + editContact(); return true; case R.id.deleteItem: deleteContact(); // delete the displayed contact @@ -86,7 +90,24 @@ public boolean onOptionsItemSelected(MenuItem item) { } // end switch } // end method onOptionsItemSelected + @Voice(commands = "edit contact") + private void editContact() { + // create an Intent to launch the AddEditContact Activity + Intent addEditContact = + new Intent(this, AddEditContact.class); + + // pass the selected contact's data as extras with the Intent + addEditContact.putExtra(AddressBook.ROW_ID, rowID); + addEditContact.putExtra("name", nameTextView.getText()); + addEditContact.putExtra("phone", phoneTextView.getText()); + addEditContact.putExtra("email", emailTextView.getText()); + addEditContact.putExtra("street", streetTextView.getText()); + addEditContact.putExtra("city", cityTextView.getText()); + startActivity(addEditContact); // start the Activity + } + // delete a contact + @Voice(commands = "delete") private void deleteContact() { // create a new AlertDialog Builder AlertDialog.Builder builder = @@ -129,6 +150,18 @@ protected void onPostExecute(Object result) { builder.show(); // display the Dialog } // end method deleteContact + @Override + public void onInit(Voicer voicer, int status) { + mVoicer = voicer; + mVoicer.addVoicerListener(new Toaster(this)); + try { + mVoicer.addVoicerListener(new VirtualAssistant(this)); + } catch (SpeakerException | InterruptedException e) { + e.printStackTrace(); + } + mVoicer.register(this); + } + // performs database query outside GUI thread private class LoadContactTask extends AsyncTask { DatabaseConnector databaseConnector =