Skip to content

Commit e96ce2e

Browse files
committed
Extract common parts of the demos to a BaseActivity class.
1 parent 5023bdf commit e96ce2e

File tree

8 files changed

+198
-324
lines changed

8 files changed

+198
-324
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<category android:name="android.intent.category.LAUNCHER" />
2222
</intent-filter>
2323
</activity>
24-
<activity android:name="com.chattylabs.demo.voice.CustomizeTheComponentActivity"
24+
<activity android:name="com.chattylabs.demo.voice.CustomConversationActivity"
2525
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
2626
android:screenOrientation="portrait"
2727
android:windowSoftInputMode="adjustResize"/>
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
package com.chattylabs.demo.voice;
2+
3+
import android.annotation.SuppressLint;
4+
import android.content.Intent;
5+
import android.content.pm.PackageManager;
6+
import android.os.Bundle;
7+
import android.support.annotation.NonNull;
8+
import android.support.v4.app.ActivityCompat;
9+
import android.support.v4.content.ContextCompat;
10+
import android.view.Menu;
11+
import android.view.MenuInflater;
12+
import android.view.MenuItem;
13+
import android.view.View;
14+
import android.widget.AdapterView;
15+
import android.widget.ArrayAdapter;
16+
import android.widget.Spinner;
17+
18+
import com.chattylabs.sdk.android.common.PermissionsHelper;
19+
import com.chattylabs.sdk.android.common.ThreadUtils;
20+
import com.chattylabs.sdk.android.voice.AndroidSpeechRecognizer;
21+
import com.chattylabs.sdk.android.voice.AndroidSpeechSynthesizer;
22+
import com.chattylabs.sdk.android.voice.ConversationalFlowComponent;
23+
import com.chattylabs.sdk.android.voice.GoogleSpeechRecognizer;
24+
import com.chattylabs.sdk.android.voice.GoogleSpeechSynthesizer;
25+
import com.chattylabs.sdk.android.voice.TextFilterForUrl;
26+
27+
import java.util.Arrays;
28+
import java.util.LinkedHashMap;
29+
import java.util.List;
30+
31+
import javax.inject.Inject;
32+
33+
import dagger.android.support.DaggerAppCompatActivity;
34+
35+
import static com.chattylabs.sdk.android.voice.ConversationalFlowComponent.*;
36+
37+
public class BaseActivity extends DaggerAppCompatActivity
38+
implements ActivityCompat.OnRequestPermissionsResultCallback {
39+
40+
private static final String ANDROID = "Android";
41+
private static final String GOOGLE = "Google";
42+
43+
private static LinkedHashMap<Integer, String> addonMap = new LinkedHashMap<>();
44+
static {
45+
addonMap.put(0, ANDROID);
46+
addonMap.put(1, GOOGLE);
47+
}
48+
49+
private static String ADDON_TYPE = ANDROID;
50+
51+
@Inject ConversationalFlowComponent component;
52+
ThreadUtils.SerialThread serialThread;
53+
SpeechSynthesizer synthesizer;
54+
SpeechRecognizer recognizer;
55+
56+
private Spinner addonSpinner;
57+
private ArrayAdapter<String> addonAdapter;
58+
59+
@Override
60+
protected void onCreate(Bundle savedInstanceState) {
61+
super.onCreate(savedInstanceState);
62+
serialThread = ThreadUtils.newSerialThread();
63+
setup();
64+
initCommonViews();
65+
//UpdateManager.register(this);
66+
}
67+
68+
@Override
69+
public void onResume() {
70+
super.onResume();
71+
//CrashManager.register(this);
72+
}
73+
74+
@Override
75+
public void onDestroy() {
76+
super.onDestroy();
77+
//UpdateManager.unregister();
78+
serialThread.shutdownNow();
79+
component.shutdown();
80+
}
81+
82+
private void initCommonViews() {
83+
addonSpinner = findViewById(R.id.addon);
84+
if (addonSpinner != null) {
85+
// Create an ArrayAdapter of the addons
86+
List<String> addonList = Arrays.asList(addonMap.values().toArray(new String[addonMap.size()]));
87+
addonAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, addonList);
88+
addonAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
89+
addonSpinner.setAdapter(addonAdapter);
90+
addonSpinner.setSelection(0);
91+
addonSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
92+
@Override
93+
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
94+
ADDON_TYPE = addonMap.get(position);
95+
setup();
96+
}
97+
98+
@Override
99+
public void onNothingSelected(AdapterView<?> parent) {
100+
}
101+
});
102+
}
103+
}
104+
105+
private void setup() {
106+
component.updateConfiguration(builder ->
107+
builder .setGoogleCredentialsResourceFile(() -> R.raw.credential)
108+
.setRecognizerServiceType(() -> {
109+
if (GOOGLE.equals(ADDON_TYPE)) {
110+
return GoogleSpeechRecognizer.class;
111+
} else {
112+
return AndroidSpeechRecognizer.class;
113+
}
114+
})
115+
.setSynthesizerServiceType(() -> {
116+
if (GOOGLE.equals(ADDON_TYPE)) {
117+
return GoogleSpeechSynthesizer.class;
118+
} else {
119+
return AndroidSpeechSynthesizer.class;
120+
}
121+
}).build());
122+
123+
String[] perms = component.requiredPermissions();
124+
PermissionsHelper.check(this,
125+
perms,
126+
() -> onRequestPermissionsResult(
127+
PermissionsHelper.REQUEST_CODE, perms,
128+
new int[] {PackageManager.PERMISSION_GRANTED}));
129+
}
130+
131+
@SuppressLint("MissingPermission")
132+
@Override
133+
public void onRequestPermissionsResult(int requestCode,
134+
@NonNull String[] permissions,
135+
@NonNull int[] grantResults) {
136+
if (PermissionsHelper.isPermissionRequest(requestCode) &&
137+
PermissionsHelper.isPermissionGranted(grantResults)) {
138+
serialThread.addTask(() -> component.setup(this, status -> {
139+
if (status.isAvailable()) {
140+
recognizer = component.getSpeechRecognizer(this);
141+
synthesizer = component.getSpeechSynthesizer(this);
142+
synthesizer.addFilter(new TextFilterForUrl());
143+
}
144+
}));
145+
}
146+
}
147+
148+
@Override
149+
public boolean onCreateOptionsMenu(Menu menu) {
150+
MenuInflater inflater = getMenuInflater();
151+
inflater.inflate(R.menu.demos, menu);
152+
return true;
153+
}
154+
155+
@Override
156+
public boolean onOptionsItemSelected(MenuItem item) {
157+
switch (item.getItemId()) {
158+
case R.id.demo_custom_conversation:
159+
ContextCompat.startActivity(this,
160+
new Intent(this, CustomConversationActivity.class), null);
161+
return true;
162+
case R.id.demo_build_from_json:
163+
ContextCompat.startActivity(this,
164+
new Intent(this, BuildFromJsonActivity.class), null);
165+
return true;
166+
default:
167+
return super.onOptionsItemSelected(item);
168+
}
169+
}
170+
171+
172+
}
Lines changed: 4 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,17 @@
11
package com.chattylabs.demo.voice;
22

33
import android.annotation.SuppressLint;
4-
import android.content.Intent;
5-
import android.content.pm.PackageManager;
64
import android.os.Bundle;
7-
import android.support.annotation.NonNull;
8-
import android.support.v4.app.ActivityCompat;
9-
import android.support.v4.content.ContextCompat;
105
import android.view.Gravity;
11-
import android.view.Menu;
12-
import android.view.MenuInflater;
13-
import android.view.MenuItem;
14-
import android.view.View;
156
import android.widget.AbsListView;
16-
import android.widget.AdapterView;
177
import android.widget.ArrayAdapter;
188
import android.widget.Button;
199
import android.widget.ListView;
20-
import android.widget.Spinner;
2110
import android.widget.TextView;
2211

23-
import com.chattylabs.sdk.android.common.PermissionsHelper;
2412
import com.chattylabs.sdk.android.common.Tag;
25-
import com.chattylabs.sdk.android.common.ThreadUtils;
26-
import com.chattylabs.sdk.android.voice.AndroidSpeechRecognizer;
27-
import com.chattylabs.sdk.android.voice.AndroidSpeechSynthesizer;
2813
import com.chattylabs.sdk.android.voice.Conversation;
29-
import com.chattylabs.sdk.android.voice.ConversationalFlowComponent;
3014
import com.chattylabs.sdk.android.voice.Flow;
31-
import com.chattylabs.sdk.android.voice.GoogleSpeechRecognizer;
32-
import com.chattylabs.sdk.android.voice.GoogleSpeechSynthesizer;
3315
import com.chattylabs.sdk.android.voice.VoiceMatch;
3416
import com.chattylabs.sdk.android.voice.VoiceMessage;
3517
import com.chattylabs.sdk.android.voice.VoiceMismatch;
@@ -42,87 +24,27 @@
4224
import java.io.IOException;
4325
import java.io.InputStream;
4426
import java.util.ArrayList;
45-
import java.util.Arrays;
46-
import java.util.LinkedHashMap;
47-
import java.util.List;
4827

49-
import javax.inject.Inject;
28+
public class BuildFromJsonActivity extends BaseActivity {
5029

51-
import dagger.android.support.DaggerAppCompatActivity;
30+
private static final String TAG = Tag.make(BuildFromJsonActivity.class);
5231

53-
public class BuildFromJsonActivity extends DaggerAppCompatActivity
54-
implements ActivityCompat.OnRequestPermissionsResultCallback {
55-
56-
private static final String TAG = Tag.make(CustomizeTheComponentActivity.class);
57-
58-
private static final String ANDROID = "Android";
59-
private static final String GOOGLE = "Google";
60-
61-
private static LinkedHashMap<Integer, String> addonMap = new LinkedHashMap<>();
62-
static {
63-
addonMap.put(0, ANDROID);
64-
addonMap.put(1, GOOGLE);
65-
}
66-
67-
private static String ADDON_TYPE = ANDROID;
68-
69-
@Inject ConversationalFlowComponent component;
70-
private ThreadUtils.SerialThread serialThread;
71-
72-
private Button proceed;
73-
private Spinner addonSpinner;
74-
private ListView conversationListView;
75-
private ArrayAdapter<String> addonAdapter;
7632
private ArrayAdapter<String> listViewAdapter;
7733

78-
@Override
79-
public boolean onCreateOptionsMenu(Menu menu) {
80-
MenuInflater inflater = getMenuInflater();
81-
inflater.inflate(R.menu.demos, menu);
82-
return true;
83-
}
84-
85-
@Override
86-
public boolean onOptionsItemSelected(MenuItem item) {
87-
switch (item.getItemId()) {
88-
case R.id.demo_conversation:
89-
ContextCompat.startActivity(this,
90-
new Intent(this, CustomizeTheComponentActivity.class), null);
91-
return true;
92-
case R.id.demo_components:
93-
ContextCompat.startActivity(this,
94-
new Intent(this, BuildFromJsonActivity.class), null);
95-
return true;
96-
default:
97-
return super.onOptionsItemSelected(item);
98-
}
99-
}
100-
10134
@Override
10235
protected void onCreate(Bundle savedInstanceState) {
10336
super.onCreate(savedInstanceState);
10437
setContentView(R.layout.activity_build_from_json);
105-
10638
initViews();
107-
serialThread = ThreadUtils.newSerialThread();
108-
setup();
109-
}
110-
111-
@Override
112-
public void onDestroy() {
113-
super.onDestroy();
114-
//UpdateManager.unregister();
115-
serialThread.shutdownNow();
116-
component.shutdown();
11739
}
11840

11941
private void initViews() {
120-
proceed = findViewById(R.id.proceed);
42+
Button proceed = findViewById(R.id.proceed);
12143
proceed.setOnClickListener(v -> {
12244
loadConversation();
12345
});
12446

125-
conversationListView = findViewById(R.id.conversation);
47+
ListView conversationListView = findViewById(R.id.conversation);
12648
listViewAdapter = new ArrayAdapter<>(this, R.layout.item_block,
12749
R.id.conversation_item_text,
12850
new ArrayList<>());
@@ -134,34 +56,6 @@ private void initViews() {
13456
AbsListView.LayoutParams.WRAP_CONTENT, Gravity.CENTER));
13557
conversationListView.setAdapter(listViewAdapter);
13658
conversationListView.setEmptyView(emptyView);
137-
138-
addonSpinner = findViewById(R.id.addon);
139-
// Create an ArrayAdapter of the addons
140-
List<String> addonList = Arrays.asList(addonMap.values().toArray(new String[addonMap.size()]));
141-
addonAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, addonList);
142-
addonAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
143-
addonSpinner.setAdapter(addonAdapter);
144-
addonSpinner.setSelection(0);
145-
addonSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
146-
@Override
147-
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
148-
ADDON_TYPE = addonMap.get(position);
149-
setup();
150-
}
151-
152-
@Override
153-
public void onNothingSelected(AdapterView<?> parent) {
154-
}
155-
});
156-
}
157-
158-
private void setup() {
159-
String[] perms = component.requiredPermissions();
160-
PermissionsHelper.check(this,
161-
perms,
162-
() -> onRequestPermissionsResult(
163-
PermissionsHelper.REQUEST_CODE, perms,
164-
new int[] {PackageManager.PERMISSION_GRANTED}));
16559
}
16660

16761
@SuppressLint("MissingPermission")
@@ -252,35 +146,4 @@ public String loadJSONFromAsset() {
252146
}
253147
return json;
254148
}
255-
256-
@SuppressLint("MissingPermission")
257-
@Override
258-
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
259-
if (PermissionsHelper.isPermissionRequest(requestCode)) {
260-
if (PermissionsHelper.isPermissionGranted(grantResults)) {
261-
serialThread.addTask(() -> {
262-
component.updateConfiguration(builder ->
263-
builder .setGoogleCredentialsResourceFile(() -> R.raw.credential)
264-
.setRecognizerServiceType(() -> {
265-
switch (ADDON_TYPE) {
266-
case GOOGLE:
267-
return GoogleSpeechRecognizer.class;
268-
default:
269-
return AndroidSpeechRecognizer.class;
270-
}
271-
})
272-
.setSynthesizerServiceType(() -> {
273-
switch (ADDON_TYPE) {
274-
case GOOGLE:
275-
return GoogleSpeechSynthesizer.class;
276-
default:
277-
return AndroidSpeechSynthesizer.class;
278-
}
279-
})
280-
.build());
281-
component.setup(this, status -> {});
282-
});
283-
}
284-
}
285-
}
286149
}

0 commit comments

Comments
 (0)