I am attempting to create my own speech to text assistant. This involves the user speaking and the assistant responding to the user's input. I do this by looking for keywords that indicate the user wants to initiate a certain command. However, some commands can only be accessed if prior commands have been called already (e.g. Open Contacts > Search for Jim > Edit Number). I don't want Edit Number to be called unless Open Contacts and "Search for XXX" is called first.
Because of this, I have resorted to using an Enum class to label where the user is in the sequence of commands. Then, I use a switch to determine which lines of code to execute once I identify where the user is in the program. This seems unnecessarily complex and not easily maintainable. I was not able to find anything online about this since I don't know any keywords for this technique/process.
Is there a more efficient and maintainable way of programming the navigation for a menu interface such as this?
public void interpretResults(String results){
switch (primaryStage) {
case firstStage:
switch (results) {
case "identification":
case "id":
setMessage(EnumPPSAssistantMessages.message_IDNumber);
id = 0;
primaryStage = EnumStages.secondStage;
break;
case "lotnumber":
case "lot":
setMessage(EnumPPSAssistantMessages.message_lotNumber);
id = 1;
primaryStage = EnumStages.secondStage;
break;
case "list":
case "listall":
startNewActivity(ListAllOnline.class);
break;
case "usedcomponents":
case "usedcomponent":
setInput("Use component(s).");
case "usecomponents":
case "usecomponent":
setMessage(EnumPPSAssistantMessages.message_shopOrderNumber);
id = 3;
primaryStage = EnumStages.secondStage;
break;
case "bom":
case "billofmaterials":
setMessage(EnumPPSAssistantMessages.message_shopOrderNumber);
id = 2;
primaryStage = EnumStages.secondStage;
break;
case "returncomponents":
case "returncomponent":
setMessage(EnumPPSAssistantMessages.message_shopOrderNumber);
id = 4;
primaryStage = EnumStages.secondStage;
break;
case "usedparts":
case "usedpart":
setInput("Use part(s).");
case "useparts":
case "usepart":
setMessage(EnumPPSAssistantMessages.message_shopOrderNumber);
id = 5;
primaryStage = EnumStages.secondStage;
break;
case "returnparts":
case "returnpart":
setMessage(EnumPPSAssistantMessages.message_shopOrderNumber);
id = 6;
primaryStage = EnumStages.secondStage;
break;
case "pdf":
case "displaypdf":
setMessage(EnumPPSAssistantMessages.message_shopOrderNumber);
id = 7;
primaryStage = EnumStages.secondStage;
break;
case "commands":
setMessage(EnumPPSAssistantMessages.message_commands);
break;
case "":
default:
System.out.println("No match. Input is: " + temp);
setMessage(EnumPPSAssistantMessages.error_noMatch);
break;
}
break;
case secondStage:
switch (results) {
case "back":
case "go back":
id = -1;
primaryStage = EnumStages.firstStage;
setMessage(EnumPPSAssistantMessages.start_message);
return;
}
Variables.setVoiceOutput(func.formatSpeechInput(var.getVoiceOutput()));
setInput(var.getVoiceOutput());
switch (id) {
case 0:
case 1:
primaryStage = EnumStages.thirdStage;
break;
case 2:
startNewActivity(DisplayBillOfMaterials.class);
break;
case 3:
startNewActivity(ShopOrderTransactionPreCheck.class, new String[]{"type"}, new String[]{"usecomponents"});
break;
case 4:
startNewActivity(ShopOrderTransactionPreCheck.class, new String[]{"type"}, new String[]{"returncomponents"});
break;
case 5:
startNewActivity(ShopOrderTransactionPreCheck.class, new String[]{"type"}, new String[]{"useparts"});
break;
case 6:
startNewActivity(ShopOrderTransactionPreCheck.class, new String[]{"type"}, new String[]{"returnparts"});
break;
case 7:
startNewActivity(DownloadShopOrderPDF.class);
break;
case -1:
primaryStage = EnumStages.firstStage;
setMessage(EnumPPSAssistantMessages.start_message);
}
break;
}
}