Skip to content

Commit 5023bdf

Browse files
committed
Finished demo from json file.
1 parent b2add68 commit 5023bdf

File tree

16 files changed

+233
-82
lines changed

16 files changed

+233
-82
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,20 @@
1111
android:supportsRtl="true"
1212
android:theme="@style/AppTheme">
1313
<meta-data android:name="net.hockeyapp.android.appIdentifier" android:value="${HOCKEYAPP_APP_ID}" />
14-
<activity android:name="com.chattylabs.demo.voice.MainActivity"
14+
<activity android:name="com.chattylabs.demo.voice.BuildFromJsonActivity"
1515
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
1616
android:screenOrientation="portrait"
17-
android:windowSoftInputMode="stateVisible|adjustResize">
17+
android:windowSoftInputMode="adjustResize">
1818
<intent-filter>
1919
<action android:name="android.intent.action.MAIN" />
2020

2121
<category android:name="android.intent.category.LAUNCHER" />
2222
</intent-filter>
2323
</activity>
24-
<activity android:name="com.chattylabs.demo.voice.ConversationCreatorActivity"
24+
<activity android:name="com.chattylabs.demo.voice.CustomizeTheComponentActivity"
2525
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
2626
android:screenOrientation="portrait"
27-
android:windowSoftInputMode="stateVisible|adjustResize"/>
27+
android:windowSoftInputMode="adjustResize"/>
2828
</application>
2929

3030
</manifest>

app/src/main/java/com/chattylabs/demo/voice/MainActivity.java renamed to app/src/main/java/com/chattylabs/demo/voice/BuildFromJsonActivity.java

Lines changed: 79 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,18 @@
77
import android.support.annotation.NonNull;
88
import android.support.v4.app.ActivityCompat;
99
import android.support.v4.content.ContextCompat;
10+
import android.view.Gravity;
1011
import android.view.Menu;
1112
import android.view.MenuInflater;
1213
import android.view.MenuItem;
1314
import android.view.View;
15+
import android.widget.AbsListView;
1416
import android.widget.AdapterView;
1517
import android.widget.ArrayAdapter;
1618
import android.widget.Button;
19+
import android.widget.ListView;
1720
import android.widget.Spinner;
21+
import android.widget.TextView;
1822

1923
import com.chattylabs.sdk.android.common.PermissionsHelper;
2024
import com.chattylabs.sdk.android.common.Tag;
@@ -28,6 +32,7 @@
2832
import com.chattylabs.sdk.android.voice.GoogleSpeechSynthesizer;
2933
import com.chattylabs.sdk.android.voice.VoiceMatch;
3034
import com.chattylabs.sdk.android.voice.VoiceMessage;
35+
import com.chattylabs.sdk.android.voice.VoiceMismatch;
3136
import com.chattylabs.sdk.android.voice.VoiceNode;
3237

3338
import org.json.JSONArray;
@@ -36,6 +41,7 @@
3641

3742
import java.io.IOException;
3843
import java.io.InputStream;
44+
import java.util.ArrayList;
3945
import java.util.Arrays;
4046
import java.util.LinkedHashMap;
4147
import java.util.List;
@@ -44,10 +50,10 @@
4450

4551
import dagger.android.support.DaggerAppCompatActivity;
4652

47-
public class MainActivity extends DaggerAppCompatActivity
53+
public class BuildFromJsonActivity extends DaggerAppCompatActivity
4854
implements ActivityCompat.OnRequestPermissionsResultCallback {
4955

50-
private static final String TAG = Tag.make(ConversationCreatorActivity.class);
56+
private static final String TAG = Tag.make(CustomizeTheComponentActivity.class);
5157

5258
private static final String ANDROID = "Android";
5359
private static final String GOOGLE = "Google";
@@ -58,19 +64,21 @@ public class MainActivity extends DaggerAppCompatActivity
5864
addonMap.put(1, GOOGLE);
5965
}
6066

61-
private static String ADDON_TYPE = addonMap.get(0);
67+
private static String ADDON_TYPE = ANDROID;
6268

6369
@Inject ConversationalFlowComponent component;
70+
private ThreadUtils.SerialThread serialThread;
6471

6572
private Button proceed;
6673
private Spinner addonSpinner;
74+
private ListView conversationListView;
6775
private ArrayAdapter<String> addonAdapter;
68-
private ThreadUtils.SerialThread serialThread;
76+
private ArrayAdapter<String> listViewAdapter;
6977

7078
@Override
7179
public boolean onCreateOptionsMenu(Menu menu) {
7280
MenuInflater inflater = getMenuInflater();
73-
inflater.inflate(R.menu.demo, menu);
81+
inflater.inflate(R.menu.demos, menu);
7482
return true;
7583
}
7684

@@ -79,11 +87,11 @@ public boolean onOptionsItemSelected(MenuItem item) {
7987
switch (item.getItemId()) {
8088
case R.id.demo_conversation:
8189
ContextCompat.startActivity(this,
82-
new Intent(this, ConversationCreatorActivity.class), null);
90+
new Intent(this, CustomizeTheComponentActivity.class), null);
8391
return true;
8492
case R.id.demo_components:
8593
ContextCompat.startActivity(this,
86-
new Intent(this, MainActivity.class), null);
94+
new Intent(this, BuildFromJsonActivity.class), null);
8795
return true;
8896
default:
8997
return super.onOptionsItemSelected(item);
@@ -93,7 +101,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
93101
@Override
94102
protected void onCreate(Bundle savedInstanceState) {
95103
super.onCreate(savedInstanceState);
96-
setContentView(R.layout.activity_main);
104+
setContentView(R.layout.activity_build_from_json);
97105

98106
initViews();
99107
serialThread = ThreadUtils.newSerialThread();
@@ -109,16 +117,28 @@ public void onDestroy() {
109117
}
110118

111119
private void initViews() {
112-
addonSpinner = findViewById(R.id.addon);
113120
proceed = findViewById(R.id.proceed);
114121
proceed.setOnClickListener(v -> {
115122
loadConversation();
116123
});
117124

125+
conversationListView = findViewById(R.id.conversation);
126+
listViewAdapter = new ArrayAdapter<>(this, R.layout.item_block,
127+
R.id.conversation_item_text,
128+
new ArrayList<>());
129+
listViewAdapter.setNotifyOnChange(true);
130+
TextView emptyView = new TextView(this);
131+
emptyView.setText("Choose an addon and press on proceed");
132+
emptyView.setLayoutParams(new AbsListView.LayoutParams(
133+
AbsListView.LayoutParams.WRAP_CONTENT,
134+
AbsListView.LayoutParams.WRAP_CONTENT, Gravity.CENTER));
135+
conversationListView.setAdapter(listViewAdapter);
136+
conversationListView.setEmptyView(emptyView);
137+
138+
addonSpinner = findViewById(R.id.addon);
118139
// Create an ArrayAdapter of the addons
119140
List<String> addonList = Arrays.asList(addonMap.values().toArray(new String[addonMap.size()]));
120-
addonAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item,
121-
addonList);
141+
addonAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, addonList);
122142
addonAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
123143
addonSpinner.setAdapter(addonAdapter);
124144
addonSpinner.setSelection(0);
@@ -146,33 +166,68 @@ private void setup() {
146166

147167
@SuppressLint("MissingPermission")
148168
private void loadConversation() {
169+
listViewAdapter.clear();
170+
listViewAdapter.notifyDataSetChanged();
149171
Conversation conversation = component.create(this);
150172
Flow flow = conversation.prepare();
151173
try {
174+
String dots = ". . .";
152175
VoiceNode firstNode = null;
153176
VoiceNode lastNode = null;
154177
JSONArray array = new JSONArray(loadJSONFromAsset());
155178
for (int a = 0, size = array.length(); a < size; a++) {
156179

157180
JSONObject object = array.getJSONObject(a);
158181

159-
JSONArray jsonArray = object.getJSONArray("results");
160-
String[] stringArray = new String[jsonArray.length()];
161-
for (int i = 0; i < jsonArray.length(); i++) {
162-
stringArray[i]= jsonArray.getString(i);
163-
}
164-
182+
String text = object.getString("message");
165183
VoiceMessage message = VoiceMessage.newBuilder()
166-
.setText(object.getString("message")).build();
167-
VoiceMatch match = VoiceMatch.newBuilder()
168-
.setExpectedResults(stringArray).build();
184+
.setText(text)
185+
.setOnReady(() -> {
186+
runOnUiThread(() -> {
187+
listViewAdapter.add(text);
188+
});
189+
}).build();
190+
191+
VoiceMatch matches = null;
192+
VoiceMismatch noMatches = null;
193+
if (object.has("results")) {
194+
JSONArray jsonArray = object.getJSONArray("results");
195+
String[] stringArray = new String[jsonArray.length()];
196+
for (int i = 0; i < jsonArray.length(); i++) {
197+
stringArray[i] = jsonArray.getString(i);
198+
}
199+
matches = VoiceMatch.newBuilder()
200+
.setOnReady(() -> {
201+
listViewAdapter.add(dots);
202+
})
203+
.setExpectedResults(stringArray)
204+
.setOnMatched(strings -> {
205+
listViewAdapter.remove(dots);
206+
if (strings != null) {
207+
listViewAdapter.add(strings.get(0));
208+
conversation.next();
209+
}
210+
})
211+
.build();
212+
noMatches = VoiceMismatch.newBuilder()
213+
.setOnNotMatched(strings -> {
214+
listViewAdapter.remove(dots);
215+
listViewAdapter.add("You said: " + strings);
216+
listViewAdapter.add("I did not expect that. Please try again!");
217+
}).build();
218+
}
169219

170220
conversation.addNode(message);
171-
conversation.addNode(match);
221+
if (matches != null) {
222+
conversation.addNode(matches);
223+
conversation.addNode(noMatches);
224+
}
172225
if (lastNode != null) flow.from(lastNode).to(message);
173226
if (firstNode == null) firstNode = message;
174-
flow.from(message).to(match);
175-
lastNode = match;
227+
if (matches != null) {
228+
flow.from(message).to(matches, noMatches);
229+
}
230+
lastNode = matches != null ? matches : message;
176231
}
177232

178233
conversation.start(firstNode);
@@ -185,7 +240,7 @@ private void loadConversation() {
185240
public String loadJSONFromAsset() {
186241
String json = null;
187242
try {
188-
InputStream is = getAssets().open("conversation.json");
243+
InputStream is = getResources().openRawResource(R.raw.demo_conversation);
189244
int size = is.available();
190245
byte[] buffer = new byte[size];
191246
is.read(buffer);

app/src/main/java/com/chattylabs/demo/voice/ConversationCreatorActivity.java renamed to app/src/main/java/com/chattylabs/demo/voice/CustomizeTheComponentActivity.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@
5656
import static com.chattylabs.sdk.android.voice.ConversationalFlowComponent.matches;
5757

5858

59-
public class ConversationCreatorActivity extends DaggerAppCompatActivity
59+
public class CustomizeTheComponentActivity extends DaggerAppCompatActivity
6060
implements ActivityCompat.OnRequestPermissionsResultCallback {
6161

62-
private static final String TAG = Tag.make(ConversationCreatorActivity.class);
62+
private static final String TAG = Tag.make(CustomizeTheComponentActivity.class);
6363

6464
// Constants
6565
private static final int CHECK = 3;
@@ -101,7 +101,7 @@ public class ConversationCreatorActivity extends DaggerAppCompatActivity
101101
@Override
102102
public boolean onCreateOptionsMenu(Menu menu) {
103103
MenuInflater inflater = getMenuInflater();
104-
inflater.inflate(R.menu.demo, menu);
104+
inflater.inflate(R.menu.demos, menu);
105105
return true;
106106
}
107107

@@ -110,18 +110,21 @@ public boolean onOptionsItemSelected(MenuItem item) {
110110
switch (item.getItemId()) {
111111
case R.id.demo_conversation:
112112
ContextCompat.startActivity(this,
113-
new Intent(this, ConversationCreatorActivity.class), null);
113+
new Intent(this, CustomizeTheComponentActivity.class), null);
114+
return true;
114115
case R.id.demo_components:
115116
ContextCompat.startActivity(this,
116-
new Intent(this, MainActivity.class), null);
117+
new Intent(this, BuildFromJsonActivity.class), null);
118+
return true;
119+
default:
120+
return super.onOptionsItemSelected(item);
117121
}
118-
return super.onOptionsItemSelected(item);
119122
}
120123

121124
@Override
122125
protected void onCreate(Bundle savedInstanceState) {
123126
super.onCreate(savedInstanceState);
124-
setContentView(R.layout.activity_conversation_creator);
127+
setContentView(R.layout.activity_customize_the_component);
125128
initViews();
126129
initActions();
127130
peripheral = new Peripheral((AudioManager) getSystemService(AUDIO_SERVICE));

app/src/main/java/com/chattylabs/demo/voice/DemoApplication.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ static abstract class DemoModule {
3232
abstract ILogger provideLogger(ILoggerImpl logger);
3333

3434
@ContributesAndroidInjector
35-
abstract ConversationCreatorActivity conversationCreatorActivity();
35+
abstract CustomizeTheComponentActivity conversationCreatorActivity();
3636

3737
@ContributesAndroidInjector
38-
abstract MainActivity mainActivity();
38+
abstract BuildFromJsonActivity mainActivity();
3939
}
4040

4141
@Override

app/src/main/res/layout/activity_main.xml renamed to app/src/main/res/layout/activity_build_from_json.xml

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,49 +6,67 @@
66
android:layout_width="match_parent"
77
android:layout_height="match_parent"
88
android:animateLayoutChanges="true"
9-
tools:context="com.chattylabs.demo.voice.ConversationCreatorActivity">
9+
android:background="#ffffff"
10+
tools:context="com.chattylabs.demo.voice.CustomizeTheComponentActivity">
1011

1112
<android.support.constraint.Guideline
1213
android:id="@+id/guideline"
13-
android:layout_width="wrap_content"
14+
android:layout_width="0dp"
1415
android:layout_height="wrap_content"
1516
android:orientation="horizontal"
16-
app:layout_constraintGuide_percent="0.55" />
17+
app:layout_constraintGuide_percent="0.65" />
1718

18-
<TextView
19-
android:id="@+id/execution"
19+
<ListView
20+
android:id="@+id/conversation"
2021
android:layout_width="0dp"
2122
android:layout_height="0dp"
22-
android:background="@android:color/background_dark"
23-
android:gravity="bottom"
23+
android:background="#be4a4a"
24+
android:divider="@null"
25+
android:dividerHeight="3dp"
2426
android:padding="10dp"
25-
android:scrollbars="vertical"
26-
android:textColor="@android:color/darker_gray"
27+
android:stackFromBottom="true"
28+
android:transcriptMode="alwaysScroll"
2729
app:layout_constraintBottom_toTopOf="@+id/guideline"
2830
app:layout_constraintEnd_toEndOf="parent"
2931
app:layout_constraintStart_toStartOf="parent"
30-
app:layout_constraintTop_toTopOf="parent" />
32+
app:layout_constraintTop_toTopOf="parent"
33+
tools:listitem="@layout/item_block" />
34+
35+
<View
36+
android:layout_width="match_parent"
37+
android:layout_height="1dp"
38+
android:background="@android:color/black"
39+
app:layout_constraintTop_toTopOf="@+id/guideline"
40+
app:layout_constraintEnd_toEndOf="parent"
41+
app:layout_constraintStart_toStartOf="parent"/>
3142

3243
<Spinner
3344
android:id="@+id/addon"
3445
android:layout_width="wrap_content"
3546
android:layout_height="wrap_content"
47+
android:layout_marginBottom="8dp"
3648
android:layout_marginEnd="8dp"
3749
android:layout_marginStart="8dp"
3850
android:layout_marginTop="8dp"
3951
android:minWidth="100dp"
40-
app:layout_constraintEnd_toEndOf="parent"
52+
app:layout_constraintBottom_toBottomOf="@+id/proceed"
53+
app:layout_constraintEnd_toStartOf="@+id/proceed"
54+
app:layout_constraintHorizontal_bias="0.5"
55+
app:layout_constraintHorizontal_chainStyle="packed"
4156
app:layout_constraintStart_toStartOf="parent"
42-
app:layout_constraintTop_toBottomOf="@+id/guideline" />
57+
app:layout_constraintTop_toTopOf="@+id/proceed" />
4358

4459
<Button
4560
android:id="@+id/proceed"
4661
android:layout_width="wrap_content"
4762
android:layout_height="wrap_content"
48-
android:layout_marginEnd="8dp"
63+
android:layout_marginBottom="8dp"
64+
android:layout_marginTop="8dp"
4965
android:text="Proceed"
50-
app:layout_constraintTop_toBottomOf="@+id/addon"
51-
app:layout_constraintStart_toStartOf="parent"
52-
app:layout_constraintEnd_toEndOf="parent" />
66+
app:layout_constraintBottom_toBottomOf="parent"
67+
app:layout_constraintEnd_toEndOf="parent"
68+
app:layout_constraintHorizontal_bias="0.5"
69+
app:layout_constraintStart_toEndOf="@+id/addon"
70+
app:layout_constraintTop_toBottomOf="@+id/guideline" />
5371

5472
</android.support.constraint.ConstraintLayout>

app/src/main/res/layout/activity_conversation_creator.xml renamed to app/src/main/res/layout/activity_customize_the_component.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
android:layout_width="match_parent"
77
android:layout_height="match_parent"
88
android:animateLayoutChanges="true"
9-
tools:context="com.chattylabs.demo.voice.ConversationCreatorActivity">
9+
tools:context="com.chattylabs.demo.voice.CustomizeTheComponentActivity">
1010

1111
<android.support.constraint.Guideline
1212
android:id="@+id/guideline"

0 commit comments

Comments
 (0)