/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.speech;
import android.os.Parcel;
import android.os.Parcelable;
/**
* RecognitionResult is a passive object that stores a single recognized query
* and its search result.
*
* TODO: Revisit and improve this class, reconciling the different types of actions and
* the different ways they are represented. Maybe we should have a separate result object
* for each type, and put them (type/value) in bundle?
* {@hide}
*/
public class RecognitionResult implements Parcelable {
/**
* Status of the recognize request.
*/
public static final int NETWORK_TIMEOUT = 1; // Network operation timed out.
public static final int NETWORK_ERROR = 2; // Other network related errors.
public static final int AUDIO_ERROR = 3; // Audio recording error.
public static final int SERVER_ERROR = 4; // Server sends error status.
public static final int CLIENT_ERROR = 5; // Other client side errors.
public static final int SPEECH_TIMEOUT = 6; // No speech input
public static final int NO_MATCH = 7; // No recognition result matched.
public static final int SERVICE_BUSY = 8; // RecognitionService busy.
/**
* Type of the recognition results.
*/
public static final int RAW_RECOGNITION_RESULT = 0;
public static final int WEB_SEARCH_RESULT = 1;
public static final int CONTACT_RESULT = 2;
public static final int ACTION_RESULT = 3;
/**
* A factory method to create a raw RecognitionResult
*
* @param sentence the recognized text.
*/
public static RecognitionResult newRawRecognitionResult(String sentence) {
return new RecognitionResult(RAW_RECOGNITION_RESULT, sentence, null, null);
}
/**
* A factory method to create a RecognitionResult for contacts.
*
* @param contact the contact name.
* @param phoneType the phone type.
* @param callAction whether this result included a command to "call", or
* just the contact name.
*/
public static RecognitionResult newContactResult(String contact, int phoneType,
boolean callAction) {
return new RecognitionResult(CONTACT_RESULT, contact, phoneType, callAction);
}
/**
* A factory method to create a RecognitionResult for a web search query.
*
* @param query the query string.
* @param html the html page of the search result.
* @param url the url that performs the search with the query.
*/
public static RecognitionResult newWebResult(String query, String html, String url) {
return new RecognitionResult(WEB_SEARCH_RESULT, query, html, url);
}
/**
* A factory method to create a RecognitionResult for an action.
*
* @param action the action type
* @param query the query string associated with that action.
*/
public static RecognitionResult newActionResult(int action, String query) {
return new RecognitionResult(ACTION_RESULT, action, query);
}
public static final Parcelable.Creator<RecognitionResult> CREATOR =
new Parcelable.Creator<RecognitionResult>() {
public RecognitionResult createFromParcel(Parcel in) {
return new RecognitionResult(in);
}
public RecognitionResult[] newArray(int size) {
return new RecognitionResult[size];
}
};
/**
* Result type.
*/
public final int mResultType;
/**
* The recognized string when mResultType is WEB_SEARCH_RESULT. The name of
* the contact when mResultType is CONTACT_RESULT. The relevant query when
* mResultType is ACTION_RESULT.
*/
public final String mText;
/**
* The HTML result page for the query. If this is null, then the application
* must use the url field to get the HTML result page.
*/
public final String mHtml;
/**
* The url to get the result page for the query string. The application must
* use this url instead of performing the search with the query.
*/
public final String mUrl;
/**
* Phone number type. This is valid only when mResultType == CONTACT_RESULT.
*/
public final int mPhoneType;
/**
* Action type. This is valid only when mResultType == ACTION_RESULT.
*/
public final int mAction;
/**
* Whether a contact recognition result included a command to "call". This
* is valid only when mResultType == CONTACT_RESULT.
*/
public final boolean mCallAction;
private RecognitionResult(int type, int action, String query) {
mResultType = type;
mAction = action;
mText = query;
mHtml = null;
mUrl = null;
mPhoneType = -1;
mCallAction = false;
}
private RecognitionResult(int type, String query, String html, String url) {
mResultType = type;
mText = query;
mHtml = html;
mUrl = url;
mPhoneType = -1;
mAction = -1;
mCallAction = false;
}
private RecognitionResult(int type, String query, int phoneType, boolean callAction) {
mResultType = type;
mText = query;
mPhoneType = phoneType;
mHtml = null;
mUrl = null;
mAction = -1;
mCallAction = callAction;
}
private RecognitionResult(Parcel in) {
mResultType = in.readInt();
mText = in.readString();
mHtml = in.readString();
mUrl = in.readString();
mPhoneType = in.readInt();
mAction = in.readInt();
mCallAction = (in.readInt() == 1);
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mResultType);
out.writeString(mText);
out.writeString(mHtml);
out.writeString(mUrl);
out.writeInt(mPhoneType);
out.writeInt(mAction);
out.writeInt(mCallAction ? 1 : 0);
}
@Override
public String toString() {
String resultType[] = {
"RAW", "WEB", "CONTACT", "ACTION"
};
return "[type=" + resultType[mResultType] + ", text=" + mText + ", mUrl=" + mUrl
+ ", html=" + mHtml + ", mAction=" + mAction + ", mCallAction=" + mCallAction + "]";
}
public int describeContents() {
// no special description
return 0;
}
}