@Override
 public void handleMessage(Message msg) {
   switch (msg.what) {
     case VoiceCommandListener.ACTION_MAIN_VOICE_UI:
       mVoiceUI.handleAsyncVoiceMessage((VoiceMessage) msg.obj);
       break;
     case VoiceCommandListener.ACTION_MAIN_VOICE_TRAINING:
       mVoiceTraining.handleAsyncVoiceMessage((VoiceMessage) msg.obj);
       break;
     case VoiceCommandListener.ACTION_MAIN_VOICE_RECOGNIZE:
       mVoiceRecognize.handleAsyncVoiceMessage((VoiceMessage) msg.obj);
       break;
     case VoiceCommandListener.ACTION_MAIN_VOICE_CONTACTS:
       mVoiceContacts.handleAsyncVoiceMessage((VoiceMessage) msg.obj);
       break;
     case VoiceCommandListener.ACTION_VOICE_CONTACTS_NAME:
       handleAsyncContactsMsg((String[]) msg.obj);
       break;
     case VoiceCommandBusiness.ACTION_MAIN_VOICE_SERVICE:
     case VoiceCommandBusiness.ACTION_MAIN_VOICE_BROADCAST:
       mVoiceServiceInternal.handleAsyncVoiceMessage((VoiceMessage) msg.obj);
       break;
     default:
       // do nothing
       break;
   }
 }
 /*
  * Send all contacts name to next dispatcher
  *
  * @param contactsNameList contacts name list
  */
 public void handleAsyncContactsMsg(String[] contactsNames) {
   VoiceMessage message = new VoiceMessage();
   message.mMainAction = VoiceCommandListener.ACTION_MAIN_VOICE_CONTACTS;
   message.mSubAction = VoiceCommandListener.ACTION_VOICE_CONTACTS_NAME;
   Bundle bundle = DataPackage.packageSendInfo(contactsNames, null);
   message.mExtraData = bundle;
   mVoiceContacts.handleAsyncVoiceMessage(message);
 }