Skip to content
This repository was archived by the owner on Apr 6, 2023. It is now read-only.

Commit 4634133

Browse files
authored
Dialogflow sample (#112)
* Initial commit * Addressed review comments * Added README File * Update README.md * Update README.md * Update README.md * refactor: refactoring the code * Add stopwatchagent.zip file * Update README.md * Update README.md * Changes has per Github comments * Combine the three requests into one. Dropdown instead of multi-select checkbox. Remove the Readback on the user input * Addressed review comments * Using the Audio returned from Dialogflow. * Addressed review comments * Separated the Authentication code from AppController.java to AuthUtils.java * Code Refinement * Update README.md * Update README.md * Addressed review comments * function to convert the time from UTC to local TimeZone added * Code readability update * Update README.md index.js Link update * Speech2speech Initial commit * Separate samples from single PR into multiple * Update gcp_project_id value * Add missing steps / small code cleanup * Nit style
1 parent 8862a82 commit 4634133

File tree

66 files changed

+2318
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+2318
-0
lines changed

dialogflow/.gitignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
*.iml
2+
.gradle
3+
/local.properties
4+
/.idea/workspace.xml
5+
/.idea/libraries
6+
.DS_Store
7+
/build
8+
/captures
9+
.externalNativeBuild

dialogflow/README.md

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# Dialogflow Sample
2+
3+
This app demonstrates how to make gRPC connections to the [Dialogflow API](https://cloud.google.com/dialogflow-enterprise/)
4+
5+
The app demonstrates how to detect intents:
6+
- Via Text / Audio
7+
- With Sentiment Analysis
8+
- With Text-to-Speech
9+
- With Knowledge Connectors
10+
11+
To call the Dialogflow API from Android, you need provide authorization tokens with each request. To
12+
get this token, this sample uses a Firebase Function to genereate these tokens on the behalf of a
13+
service account. The token is returned to the app via Firebase Cloud Messaging.
14+
15+
## Prerequisites
16+
- An Android device or emulator
17+
- Android Studio 3 or later
18+
19+
## Setup
20+
- Create a project (or use an existing one) in the [Google Cloud Console][cloud-console]
21+
- Enable the [Dialogflow API](https://console.cloud.google.com/apis/library/dialogflow.googleapis.com).
22+
- Enable the [IAM Service Account Credentials API](https://console.cloud.google.com/apis/library/iamcredentials.googleapis.com).
23+
- [Enable billing](https://console.cloud.google.com/billing).
24+
- Be sure that you have gone through the steps by expanding the [Create an agent](https://cloud.google.com/dialogflow-enterprise/docs/quickstart-console#create-an-agent)
25+
to create and configure your stopwatch agent.
26+
- [Import the Dialogflow Agent](https://dialogflow.com/docs/agents/export-import-restore#import)
27+
using the `SampleAgent.zip` which is located in the `resources` directory.
28+
- [Create a Service account](https://cloud.google.com/iam/docs/creating-managing-service-accounts)
29+
with the following IAM roles: (Example name: `dialogflow-client`. [For more info on: how to add roles to a Service Account](https://cloud.google.com/iam/docs/granting-roles-to-service-accounts#granting_access_to_a_service_account_for_a_resource))
30+
- Dialogflow Client (Used by the app to make detect intent requests)
31+
- Dialogflow Reader (Used by the app to list knowledge bases)
32+
- Enable beta features for:
33+
- [Sentiment Analysis](https://cloud.google.com/dialogflow-enterprise/docs/sentiment#enable_beta_features)
34+
- [Text-to-Speech](https://cloud.google.com/dialogflow-enterprise/docs/detect-intent-tts#enable_beta_features)
35+
- [Knowledge Connectors](https://cloud.google.com/dialogflow-enterprise/docs/knowledge-connectors#enable_beta_features)
36+
37+
### Setup the app
38+
- Clone this repository `git clone https://github.com/GoogleCloudPlatform/android-docs-samples.git`
39+
- Replace `GCP_PROJECT_ID` in strings.xml with your Project ID
40+
41+
###  Setup Firebase on the application:
42+
- Complete the steps for [Add Firebase to your app](https://firebase.google.com/docs/android/setup)
43+
and expand the "Create a Firebase project" section for instructions on how to add project to your
44+
Firebase console. Note: No need to complete any other sections, they are already done.
45+
- In the [Firebase console](https://console.firebase.google.com/), open the "Authentication" section under Develop.
46+
- On the **Sign-in Methods** page, enable the **Anonymous** sign-in method.
47+
- Give the package name of the app as `com.google.cloud.examples.dialogflow`
48+
49+
###  Setup and Deploy the Firebase Function
50+
The Firebase Function provides auth tokens to your app, You'll be using a provided sample function to be run with this app.
51+
52+
- Follow the steps in this [guide](https://firebase.google.com/docs/functions/get-started) for:
53+
- "2. Set up Node.js and the Firebase CLI"
54+
- "3. Initialize Firebase SDK for Cloud Functions".
55+
- Replace `index.js` file with the [provided index.js](https://github.com/GoogleCloudPlatform/nodejs-docs-samples/blob/master/functions/tokenservice/functions/index.js).
56+
- Open `index.js`, go to the `generateAccessToken` function, and replace `SERVICE-ACCOUNT-NAME@YOUR_PROJECT_ID.iam.gserviceaccount.com` with your Service account name (`dialogflow-client`) and project id.
57+
- Deploy getOAuthToken method by running command:
58+
```
59+
firebase deploy --only functions
60+
```
61+
- On the GCP console, add the following IAM role: `Service Account Token Creator` to your
62+
"App Engine Default Service Account" ([For more info on: how to add roles to a Service Account](https://cloud.google.com/iam/docs/granting-roles-to-service-accounts#granting_access_to_a_service_account_for_a_resource))
63+
- Open the [Firebase console](https://console.firebase.google.com/)
64+
- Select Databases on the side menu
65+
- Select Firestore
66+
- Click `Start collection`
67+
- Title your collection `ShortLivedAuthTOkens` and click Next
68+
- Enter `OauthToken` for the Document title and Save
69+
- For more info please refer (https://firebase.google.com/docs/functions/get-started).
70+
71+
## Run the app
72+
- You are now ready to build and run the project. In Android Studio you can do this by clicking the 'Play' button in the toolbar. This will launch the app on the emulator or on the device you've selected.
73+
- As soon the app launches, it will ask for the google sign-in.
74+
- After successful signing in, choose the option by selecting a checkbox and click on chat button
75+
- Type the message to send and click on the send button on the bottom right.
76+
- Alternatively tap on the mic button to speak and send the message to the Dialogflow.
77+
78+
79+
[cloud-console]: https://console.cloud.google.com
80+
[git]: https://git-scm.com/
81+
[android-studio]: https://developer.android.com/studio
82+
[billing]: https://console.cloud.google.com/billing
83+
[Firebase]: https://firebase.google.com/

dialogflow/app/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/build

dialogflow/app/build.gradle

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
apply plugin: 'com.android.application'
2+
3+
android {
4+
compileSdkVersion 28
5+
defaultConfig {
6+
applicationId "com.google.cloud.examples.dialogflow"
7+
minSdkVersion 26
8+
targetSdkVersion 28
9+
versionCode 1
10+
versionName "1.0"
11+
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
12+
multiDexEnabled true
13+
}
14+
buildTypes {
15+
release {
16+
minifyEnabled true
17+
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18+
}
19+
}
20+
packagingOptions {
21+
exclude 'META-INF/DEPENDENCIES'
22+
exclude 'META-INF/LICENSE'
23+
exclude 'META-INF/LICENSE.txt'
24+
exclude 'META-INF/license.txt'
25+
exclude 'META-INF/NOTICE'
26+
exclude 'META-INF/NOTICE.txt'
27+
exclude 'META-INF/notice.txt'
28+
exclude 'META-INF/ASL2.0'
29+
exclude 'META-INF/INDEX.LIST'
30+
exclude 'META-INF/io.netty.versions.properties'
31+
}
32+
}
33+
34+
dependencies {
35+
36+
implementation 'com.android.support:appcompat-v7:28.0.0'
37+
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
38+
implementation 'com.android.support:design:28.0.0'
39+
configurations.all {
40+
resolutionStrategy.force 'com.android.support:support-annotations:25.3.0'
41+
}
42+
implementation fileTree(dir: 'libs', include: ['*.jar'])
43+
implementation 'androidx.appcompat:appcompat:1.0.2'
44+
implementation 'com.google.android.material:material:1.0.0'
45+
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
46+
testImplementation 'junit:junit:4.12'
47+
androidTestImplementation 'androidx.test:runner:1.2.0'
48+
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
49+
50+
implementation 'com.google.firebase:firebase-core:17.1.0'
51+
implementation 'com.google.firebase:firebase-auth:19.0.0'
52+
implementation 'com.firebaseui:firebase-ui-auth:4.1.0'
53+
implementation 'com.google.firebase:firebase-messaging:20.0.0'
54+
implementation 'com.google.firebase:firebase-functions:19.0.0'
55+
implementation 'com.android.volley:volley:1.1.1'
56+
implementation 'com.google.cloud:google-cloud-dialogflow:0.98.0-alpha'
57+
implementation group: 'io.grpc', name: 'grpc-okhttp', version: '1.21.0'
58+
implementation group: 'io.grpc', name: 'grpc-netty', version: '1.21.0'
59+
60+
}
61+
62+
63+
apply plugin: 'com.google.gms.google-services'
53.1 KB
Binary file not shown.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#Mon Jul 22 11:29:16 PDT 2019
2+
distributionBase=GRADLE_USER_HOME
3+
distributionPath=wrapper/dists
4+
zipStoreBase=GRADLE_USER_HOME
5+
zipStorePath=wrapper/dists
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip

dialogflow/app/gradlew

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
#!/usr/bin/env sh
2+
3+
##############################################################################
4+
##
5+
## Gradle start up script for UN*X
6+
##
7+
##############################################################################
8+
9+
# Attempt to set APP_HOME
10+
# Resolve links: $0 may be a link
11+
PRG="$0"
12+
# Need this for relative symlinks.
13+
while [ -h "$PRG" ] ; do
14+
ls=`ls -ld "$PRG"`
15+
link=`expr "$ls" : '.*-> \(.*\)$'`
16+
if expr "$link" : '/.*' > /dev/null; then
17+
PRG="$link"
18+
else
19+
PRG=`dirname "$PRG"`"/$link"
20+
fi
21+
done
22+
SAVED="`pwd`"
23+
cd "`dirname \"$PRG\"`/" >/dev/null
24+
APP_HOME="`pwd -P`"
25+
cd "$SAVED" >/dev/null
26+
27+
APP_NAME="Gradle"
28+
APP_BASE_NAME=`basename "$0"`
29+
30+
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31+
DEFAULT_JVM_OPTS=""
32+
33+
# Use the maximum available, or set MAX_FD != -1 to use that value.
34+
MAX_FD="maximum"
35+
36+
warn () {
37+
echo "$*"
38+
}
39+
40+
die () {
41+
echo
42+
echo "$*"
43+
echo
44+
exit 1
45+
}
46+
47+
# OS specific support (must be 'true' or 'false').
48+
cygwin=false
49+
msys=false
50+
darwin=false
51+
nonstop=false
52+
case "`uname`" in
53+
CYGWIN* )
54+
cygwin=true
55+
;;
56+
Darwin* )
57+
darwin=true
58+
;;
59+
MINGW* )
60+
msys=true
61+
;;
62+
NONSTOP* )
63+
nonstop=true
64+
;;
65+
esac
66+
67+
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68+
69+
# Determine the Java command to use to start the JVM.
70+
if [ -n "$JAVA_HOME" ] ; then
71+
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72+
# IBM's JDK on AIX uses strange locations for the executables
73+
JAVACMD="$JAVA_HOME/jre/sh/java"
74+
else
75+
JAVACMD="$JAVA_HOME/bin/java"
76+
fi
77+
if [ ! -x "$JAVACMD" ] ; then
78+
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79+
80+
Please set the JAVA_HOME variable in your environment to match the
81+
location of your Java installation."
82+
fi
83+
else
84+
JAVACMD="java"
85+
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86+
87+
Please set the JAVA_HOME variable in your environment to match the
88+
location of your Java installation."
89+
fi
90+
91+
# Increase the maximum file descriptors if we can.
92+
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93+
MAX_FD_LIMIT=`ulimit -H -n`
94+
if [ $? -eq 0 ] ; then
95+
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96+
MAX_FD="$MAX_FD_LIMIT"
97+
fi
98+
ulimit -n $MAX_FD
99+
if [ $? -ne 0 ] ; then
100+
warn "Could not set maximum file descriptor limit: $MAX_FD"
101+
fi
102+
else
103+
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104+
fi
105+
fi
106+
107+
# For Darwin, add options to specify how the application appears in the dock
108+
if $darwin; then
109+
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110+
fi
111+
112+
# For Cygwin, switch paths to Windows format before running java
113+
if $cygwin ; then
114+
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115+
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116+
JAVACMD=`cygpath --unix "$JAVACMD"`
117+
118+
# We build the pattern for arguments to be converted via cygpath
119+
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120+
SEP=""
121+
for dir in $ROOTDIRSRAW ; do
122+
ROOTDIRS="$ROOTDIRS$SEP$dir"
123+
SEP="|"
124+
done
125+
OURCYGPATTERN="(^($ROOTDIRS))"
126+
# Add a user-defined pattern to the cygpath arguments
127+
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128+
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129+
fi
130+
# Now convert the arguments - kludge to limit ourselves to /bin/sh
131+
i=0
132+
for arg in "$@" ; do
133+
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134+
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135+
136+
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137+
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138+
else
139+
eval `echo args$i`="\"$arg\""
140+
fi
141+
i=$((i+1))
142+
done
143+
case $i in
144+
(0) set -- ;;
145+
(1) set -- "$args0" ;;
146+
(2) set -- "$args0" "$args1" ;;
147+
(3) set -- "$args0" "$args1" "$args2" ;;
148+
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149+
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150+
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151+
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152+
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153+
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154+
esac
155+
fi
156+
157+
# Escape application args
158+
save () {
159+
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
160+
echo " "
161+
}
162+
APP_ARGS=$(save "$@")
163+
164+
# Collect all arguments for the java command, following the shell quoting and substitution rules
165+
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
166+
167+
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
168+
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
169+
cd "$(dirname "$0")"
170+
fi
171+
172+
exec "$JAVACMD" "$@"

0 commit comments

Comments
 (0)