package com.kuxhausen.huemore.voice;
import android.content.Context;
import android.database.Cursor;
import com.kuxhausen.huemore.R;
import com.kuxhausen.huemore.persistence.Definitions.GroupColumns;
import com.kuxhausen.huemore.persistence.Definitions.MoodColumns;
import com.kuxhausen.huemore.state.GroupMoodBrightness;
import com.kuxhausen.huemore.utils.DeferredLog;
import java.util.List;
public class SpeechParser {
public static GroupMoodBrightness parse(Context c, String best, List<String> candidates,
float[] confidences) {
if (best == null && candidates != null && !candidates.isEmpty()) {
best = candidates.get(0);
}
//TODO do something more intelligent with multiple strings and confidences
best = best.toLowerCase();
DeferredLog.d("voice", best);
GroupMoodBrightness result = new GroupMoodBrightness();
if (best.equals("lumos maxima")) {
result.group = c.getString(R.string.cap_all);
result.mood = c.getString(R.string.cap_on);
result.brightness = 100;
} else {
String[] briArgs = best.split(" brightness at ");
String[] moodArgs = best.split(" to ");
String[] moodTooArgs = best.split(" too ");
String[] moodTwoArgs = best.split(" two ");
String[] mood2Args = best.split(" 2 ");
if (briArgs.length == 2) {
DeferredLog.d("voice", briArgs[0] + "," + briArgs[1]);
String lowercaseGroupName = briArgs[0].toLowerCase().trim();
String brightness = briArgs[1].replaceAll("[^\\d]", "");
int brightnessVal = -1;
try {
brightnessVal = Integer.parseInt(brightness);
} catch (NumberFormatException e) {
}
String groupName = checkGroupName(c, lowercaseGroupName);
if (groupName != null && brightnessVal != -1) {
result.group = groupName;
result.brightness = brightnessVal;
DeferredLog.d("voice", "success:" + groupName + "," + brightnessVal);
}
} else if (moodArgs.length == 2) {
DeferredLog.d("voice", moodArgs[0] + "," + moodArgs[1]);
String lowercaseGroupName = moodArgs[0].toLowerCase().trim();
String lowercaseMoodName = moodArgs[1].toLowerCase().trim();
String groupName = checkGroupName(c, lowercaseGroupName);
String moodName = checkMoodName(c, lowercaseMoodName);
if (groupName != null && moodName != null) {
result.group = groupName;
result.mood = moodName;
DeferredLog.d("voice", "success: %s , %s", groupName, moodName);
}
} else if (moodTooArgs.length == 2) {
DeferredLog.d("voice", moodTooArgs[0] + "," + moodTooArgs[1]);
String lowercaseGroupName = moodTooArgs[0].toLowerCase().trim();
String lowercaseMoodName = moodTooArgs[1].toLowerCase().trim();
String groupName = checkGroupName(c, lowercaseGroupName);
String moodName = checkMoodName(c, lowercaseMoodName);
if (groupName != null && moodName != null) {
result.group = groupName;
result.mood = moodName;
DeferredLog.d("voice", "success: %s , %s", groupName, moodName);
}
} else if (moodTwoArgs.length == 2) {
DeferredLog.d("voice", moodTwoArgs[0] + "," + moodTwoArgs[1]);
String lowercaseGroupName = moodTwoArgs[0].toLowerCase().trim();
String lowercaseMoodName = moodTwoArgs[1].toLowerCase().trim();
String groupName = checkGroupName(c, lowercaseGroupName);
String moodName = checkMoodName(c, lowercaseMoodName);
if (groupName != null && moodName != null) {
result.group = groupName;
result.mood = moodName;
DeferredLog.d("voice", "success: %s , %s", groupName, moodName);
}
} else if (mood2Args.length == 2) {
DeferredLog.d("voice", mood2Args[0] + "," + mood2Args[1]);
String lowercaseGroupName = mood2Args[0].toLowerCase().trim();
String lowercaseMoodName = mood2Args[1].toLowerCase().trim();
String groupName = checkGroupName(c, lowercaseGroupName);
String moodName = checkMoodName(c, lowercaseMoodName);
if (groupName != null && moodName != null) {
result.group = groupName;
result.mood = moodName;
DeferredLog.d("voice", "success: %s , %s", groupName, moodName);
}
}
}
return result;
}
private static String checkGroupName(Context c, String lowercaseGroupName) {
String[] groupColumns = {GroupColumns.COL_GROUP_NAME};
String[] gWhereClause = {lowercaseGroupName};
Cursor
groupCursor =
c.getContentResolver()
.query(GroupColumns.URI, groupColumns, GroupColumns.COL_GROUP_LOWERCASE_NAME + "=?",
gWhereClause, null);
String result = null;
if (groupCursor.getCount() > 0) {
groupCursor.moveToFirst();
result = groupCursor.getString(0);
}
groupCursor.close();
return result;
}
private static String checkMoodName(Context c, String lowercaseNameCandidate) {
String[] moodColumns = {MoodColumns.COL_MOOD_NAME};
String[] mWhereClause = {lowercaseNameCandidate};
Cursor
moodCursor =
c.getContentResolver().query(MoodColumns.MOODS_URI, moodColumns,
MoodColumns.COL_MOOD_LOWERCASE_NAME + "=?", mWhereClause,
null);
String result = null;
if (moodCursor.getCount() > 0) {
moodCursor.moveToFirst();
result = moodCursor.getString(0);
}
moodCursor.close();
return result;
}
}