diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 77743538..f08ecf06 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 30aa626c..ae78c113 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -1,29 +1,113 @@ - - - - - - - - - - + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
\ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 7ac24c77..7f6167fc 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,8 +1,11 @@ + - \ No newline at end of file + diff --git a/app/build.gradle b/app/build.gradle index ac048cd8..80e31620 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,7 +13,7 @@ android { buildToolsVersion '28.0.3' defaultConfig { //applicationId "edu.cmu.hcii.sugilite" - minSdkVersion 24 + minSdkVersion 26 targetSdkVersion 26//25 versionCode 2 versionName "1.1" @@ -70,35 +70,38 @@ repositories { dependencies { implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation fileTree(include: ['*.jar'], dir: 'libs') - testCompile 'junit:junit:4.12' - implementation "com.android.support:appcompat-v7:$supportLibraryVersion"//25.3.1 - implementation "com.android.support:design:$supportLibraryVersion"//25.3.1 - implementation "com.android.support:support-v4:$supportLibraryVersion"//25.3.1 - + testImplementation 'junit:junit:4.12' + implementation "com.android.support:appcompat-v7:$supportLibraryVersion" + //25.3.1 + implementation "com.android.support:design:$supportLibraryVersion" + //25.3.1 + implementation "com.android.support:support-v4:$supportLibraryVersion" + //25.3.1 implementation 'com.google.code.gson:gson:2.2.4' implementation 'com.opencsv:opencsv:3.9' implementation 'org.apache.commons:commons-lang3:3.4' //compile 'edu.stanford.nlp:stanford-corenlp:3.8.0' //implementation("org.danilopianini:gson-extras:0.2.1") implementation 'com.squareup.okhttp3:okhttp:4.7.2' - - + implementation ('edu.stanford.nlp:stanford-corenlp:4.0.0') { + exclude group: 'com.google.protobuf', module: 'protobuf-java' + exclude group: 'javax.xml.bind', module: 'jaxb-api' + exclude group: 'com.sun.xml.bind', module: 'jaxb-impl' + } implementation files('libs/RootTools.jar') deployerJars "org.apache.maven.wagon:wagon-ssh:2.9" implementation 'com.daasuu:BubbleLayout:1.2.0' // gRPC - compile "io.grpc:grpc-okhttp:$grpcVersion" - compile "io.grpc:grpc-protobuf-lite:$grpcVersion" - compile "io.grpc:grpc-stub:$grpcVersion" - compile 'javax.annotation:javax.annotation-api:1.2' + implementation "io.grpc:grpc-okhttp:$grpcVersion" + implementation "io.grpc:grpc-protobuf-lite:$grpcVersion" + implementation "io.grpc:grpc-stub:$grpcVersion" + implementation 'javax.annotation:javax.annotation-api:1.2' protobuf 'com.google.protobuf:protobuf-java:3.3.1' // OAuth2 for Google API - compile('com.google.auth:google-auth-library-oauth2-http:0.7.0') { + implementation('com.google.auth:google-auth-library-oauth2-http:0.7.0') { exclude module: 'httpclient' } - compile 'com.squareup.okhttp3:okhttp:4.0.1' - } protobuf { diff --git a/app/src/main/java/edu/cmu/hcii/sugilite/model/block/booleanexp/SugiliteBooleanExpressionNew.java b/app/src/main/java/edu/cmu/hcii/sugilite/model/block/booleanexp/SugiliteBooleanExpressionNew.java index a2dc30a5..00abccd6 100644 --- a/app/src/main/java/edu/cmu/hcii/sugilite/model/block/booleanexp/SugiliteBooleanExpressionNew.java +++ b/app/src/main/java/edu/cmu/hcii/sugilite/model/block/booleanexp/SugiliteBooleanExpressionNew.java @@ -14,6 +14,7 @@ import edu.cmu.hcii.sugilite.ontology.helper.annotator.SugiliteTextParentAnnotator; import edu.cmu.hcii.sugilite.pumice.kb.default_query.BuiltInValueQuery; import edu.cmu.hcii.sugilite.source_parsing.SugiliteScriptExpression; +import edu.stanford.nlp.time.SUTime; import java.io.Serializable; import java.util.Date; @@ -91,14 +92,14 @@ public static Boolean evaluate(SugiliteData sugiliteData, SugiliteValue arg0, Su //normalize arg0Value and arg1Value using SugiliteTextAnnotator SugiliteTextParentAnnotator.AnnotatingResult annotatingResult0 = null; - if (arg0 instanceof SugiliteSimpleConstant) { + if (arg0 instanceof SugiliteSimpleConstant && arg0Value instanceof Number) { annotatingResult0 = ((SugiliteSimpleConstant) arg0).toAnnotatingResult(); } else if (arg0Value instanceof String) { annotatingResult0 = SugiliteTextParentAnnotator.AnnotatingResult.fromString((String) arg0Value); } SugiliteTextParentAnnotator.AnnotatingResult annotatingResult1 = null; - if (arg1 instanceof SugiliteSimpleConstant) { + if (arg1 instanceof SugiliteSimpleConstant && arg1Value instanceof Number) { annotatingResult1 = ((SugiliteSimpleConstant) arg1).toAnnotatingResult(); } else if (arg1Value instanceof String) { annotatingResult1 = SugiliteTextParentAnnotator.AnnotatingResult.fromString((String) arg1Value); @@ -109,15 +110,6 @@ public static Boolean evaluate(SugiliteData sugiliteData, SugiliteValue arg0, Su arg1Value = annotatingResult1; } - //turn strings into numbers if needed - if (arg0Value instanceof String && NumberUtils.isParsable((String)arg0Value)) { - arg0Value = NumberUtils.createNumber((String)arg0Value); - } - - if (arg1Value instanceof String && NumberUtils.isParsable((String)arg1Value)) { - arg1Value = NumberUtils.createNumber((String)arg1Value); - } - //TODO: need to implement better comparison method switch (boolOperator) { case GREATER_THAN: @@ -142,6 +134,7 @@ public static Boolean evaluate(SugiliteData sugiliteData, SugiliteValue arg0, Su throw new RuntimeException("failed to evaluate!"); } + //normalize the values for comparison private static Object normalizeValue (Object argValue) { if (argValue instanceof BuiltInValueQuery.WeatherResult) { return ((BuiltInValueQuery.WeatherResult) argValue).temperature; @@ -151,6 +144,10 @@ private static Object normalizeValue (Object argValue) { return ((Date) argValue).getTime(); } + if (argValue instanceof String && NumberUtils.isParsable((String)argValue)) { + return NumberUtils.createNumber((String)argValue); + } + return argValue; } diff --git a/app/src/main/java/edu/cmu/hcii/sugilite/model/value/SugiliteSimpleConstant.java b/app/src/main/java/edu/cmu/hcii/sugilite/model/value/SugiliteSimpleConstant.java index 0023ac83..8410b7f7 100644 --- a/app/src/main/java/edu/cmu/hcii/sugilite/model/value/SugiliteSimpleConstant.java +++ b/app/src/main/java/edu/cmu/hcii/sugilite/model/value/SugiliteSimpleConstant.java @@ -10,6 +10,7 @@ import edu.cmu.hcii.sugilite.SugiliteData; import edu.cmu.hcii.sugilite.model.block.booleanexp.SugiliteBooleanExpressionNew; import edu.cmu.hcii.sugilite.ontology.helper.annotator.SugiliteTextParentAnnotator; +import edu.stanford.nlp.time.SUTime; import static edu.cmu.hcii.sugilite.source_parsing.SugiliteScriptExpression.addQuoteToTokenIfNeeded; @@ -59,6 +60,9 @@ public T evaluate(@Nullable SugiliteData sugiliteData) { @Override public String toString() { if (value != null) { + if (value instanceof SUTime.Time) { + return "(time " + ((SUTime.Time) value).toISOString() + ")"; + } if (isNumeric(value.toString())) { //when it's a number try { diff --git a/app/src/main/java/edu/cmu/hcii/sugilite/pumice/kb/PumiceValueQueryKnowledge.java b/app/src/main/java/edu/cmu/hcii/sugilite/pumice/kb/PumiceValueQueryKnowledge.java index 6fcff5f9..29f4bfe2 100644 --- a/app/src/main/java/edu/cmu/hcii/sugilite/pumice/kb/PumiceValueQueryKnowledge.java +++ b/app/src/main/java/edu/cmu/hcii/sugilite/pumice/kb/PumiceValueQueryKnowledge.java @@ -40,7 +40,7 @@ public class PumiceValueQueryKnowledge implements Serializable { public enum ValueType {NUMERICAL, STRING} private String valueName; private ValueType valueType; - private String userUtterance = ""; + private String utterance; //holds the value -- can be a get query, a constant or a resolve query. @SkipPumiceJSONSerialization @@ -62,18 +62,19 @@ public PumiceValueQueryKnowledge(String valueName, ValueType valueType){ this(); this.valueName = valueName; this.valueType = valueType; + this.utterance = valueName; } public PumiceValueQueryKnowledge(String valueName, String userUtterance, ValueType valueType, SugiliteValue sugiliteValue){ this(valueName, valueType); this.sugiliteValue = sugiliteValue; - this.userUtterance = userUtterance; + this.utterance = userUtterance; } public PumiceValueQueryKnowledge(Context context, String valueName, ValueType valueType, SugiliteStartingBlock sugiliteStartingBlock){ this(valueName, valueType); this.sugiliteStartingBlock = sugiliteStartingBlock; - this.userUtterance = "demonstrate"; + this.utterance = "demonstrate"; //populate involvedAppNames Set involvedAppPackageNames = new HashSet<>(); for(String packageName : sugiliteStartingBlock.relevantPackages){ @@ -93,7 +94,7 @@ public void copyFrom(PumiceValueQueryKnowledge pumiceValueQueryKnowledge){ this.valueType = pumiceValueQueryKnowledge.valueType; this.sugiliteStartingBlock = pumiceValueQueryKnowledge.sugiliteStartingBlock; this.sugiliteValue = pumiceValueQueryKnowledge.sugiliteValue; - this.userUtterance = pumiceValueQueryKnowledge.userUtterance; + this.utterance = pumiceValueQueryKnowledge.utterance; this.involvedAppNames = pumiceValueQueryKnowledge.involvedAppNames; } @@ -105,6 +106,10 @@ public ValueType getValueType() { return valueType; } + public String getUtterance() { + return utterance; + } + public void setValueName(String valueName) { this.valueName = valueName; } diff --git a/app/src/main/java/edu/cmu/hcii/sugilite/source_parsing/SugiliteScriptExpression.java b/app/src/main/java/edu/cmu/hcii/sugilite/source_parsing/SugiliteScriptExpression.java index 2f289efd..c1185262 100644 --- a/app/src/main/java/edu/cmu/hcii/sugilite/source_parsing/SugiliteScriptExpression.java +++ b/app/src/main/java/edu/cmu/hcii/sugilite/source_parsing/SugiliteScriptExpression.java @@ -5,9 +5,13 @@ import edu.cmu.hcii.sugilite.model.variable.VariableValue; import edu.cmu.hcii.sugilite.ontology.*; import org.apache.commons.lang3.StringUtils; +import org.joda.time.DateTimeZone; import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; import java.util.List; +import java.util.TimeZone; import edu.cmu.hcii.sugilite.model.block.SugiliteBlock; import edu.cmu.hcii.sugilite.model.block.booleanexp.SugiliteBooleanExpression; @@ -39,6 +43,7 @@ import edu.cmu.hcii.sugilite.model.value.SugiliteSimpleConstant; import edu.cmu.hcii.sugilite.model.variable.Variable; import edu.cmu.hcii.sugilite.ontology.description.OntologyDescriptionGenerator; +import edu.stanford.nlp.time.SUTime; /** * @author toby @@ -108,7 +113,17 @@ static public List parse(SugiliteScriptNode node) { //string constant result = new SugiliteScriptExpression>(); result.setConstantValue(new SugiliteSimpleConstant<>(node.getChildren().get(1).getValue())); - } else if (node.getChildren().size() == 2 && node.getChildren().get(0).getValue() != null && node.getChildren().get(1).getValue() != null && node.getChildren().get(0).getValue().equals("number")) { + } else if (node.getChildren().size() == 2 && node.getChildren().get(0).getValue() != null && node.getChildren().get(1).getValue() != null && node.getChildren().get(0).getValue().equals("time")) { + //time constant + result = new SugiliteScriptExpression>(); + String isoTimeString = node.getChildren().get(1).getValue(); + SUTime.Time timeSUTime = SUTime.parseDateTime(isoTimeString, true); + Calendar cal = Calendar.getInstance(); + TimeZone tz = cal.getTimeZone(); + Date time = new Date(); + time.setTime(timeSUTime.getJodaTimeInstant().getMillis() - tz.getOffset(timeSUTime.getJodaTimeInstant().getMillis())); + result.setConstantValue(new SugiliteSimpleConstant(time)); + }else if (node.getChildren().size() == 2 && node.getChildren().get(0).getValue() != null && node.getChildren().get(1).getValue() != null && node.getChildren().get(0).getValue().equals("number")) { //number constant without unit result = new SugiliteScriptExpression>(); result.setConstantValue(new SugiliteSimpleConstant<>(node.getChildren().get(1).getValue())); diff --git a/app/src/main/java/edu/cmu/hcii/sugilite/source_parsing/SugiliteScriptParser.java b/app/src/main/java/edu/cmu/hcii/sugilite/source_parsing/SugiliteScriptParser.java index a841c1bf..41498235 100644 --- a/app/src/main/java/edu/cmu/hcii/sugilite/source_parsing/SugiliteScriptParser.java +++ b/app/src/main/java/edu/cmu/hcii/sugilite/source_parsing/SugiliteScriptParser.java @@ -195,6 +195,10 @@ public static String scriptToString(SugiliteBlock block){ } } + /** + * add