Voice.java revision 35c7698a1b17c3e4ca0eae753e68bf069a463d70
1ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak/*
2ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak * Copyright (C) 2014 The Android Open Source Project
3ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak *
4ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak * use this file except in compliance with the License. You may obtain a copy of
6ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak * the License at
7ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak *
8ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak * http://www.apache.org/licenses/LICENSE-2.0
9ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak *
10ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak * Unless required by applicable law or agreed to in writing, software
11ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak * License for the specific language governing permissions and limitations under
14ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak * the License.
15ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak */
16ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
17ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniakpackage android.speech.tts;
18ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
19ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniakimport android.os.Parcel;
20ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniakimport android.os.Parcelable;
21ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
22ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniakimport java.util.ArrayList;
23ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniakimport java.util.Collections;
24ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniakimport java.util.HashSet;
25ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniakimport java.util.Locale;
26ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniakimport java.util.Set;
27ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
28ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak/**
29ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak * Characteristics and features of a Text-To-Speech Voice. Each TTS Engine can expose
30ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak * multiple voices for each locale, with different set of features.
31ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak */
32ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniakpublic class Voice implements Parcelable {
33ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /** Very low, but still intelligible quality of speech synthesis */
34ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public static final int QUALITY_VERY_LOW = 100;
35ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
36ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /** Low, not human-like quality of speech synthesis */
37ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public static final int QUALITY_LOW = 200;
38ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
39ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /** Normal quality of speech synthesis */
40ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public static final int QUALITY_NORMAL = 300;
41ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
42ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /** High, human-like quality of speech synthesis */
43ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public static final int QUALITY_HIGH = 400;
44ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
45ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /** Very high, almost human-indistinguishable quality of speech synthesis */
46ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public static final int QUALITY_VERY_HIGH = 500;
47ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
48ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /** Very low expected synthesizer latency (< 20ms) */
49ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public static final int LATENCY_VERY_LOW = 100;
50ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
51ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /** Low expected synthesizer latency (~20ms) */
52ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public static final int LATENCY_LOW = 200;
53ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
54ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /** Normal expected synthesizer latency (~50ms) */
55ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public static final int LATENCY_NORMAL = 300;
56ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
57ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /** Network based expected synthesizer latency (~200ms) */
58ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public static final int LATENCY_HIGH = 400;
59ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
60ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /** Very slow network based expected synthesizer latency (> 200ms) */
61ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public static final int LATENCY_VERY_HIGH = 500;
62ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
63ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    private final String mName;
64ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    private final Locale mLocale;
65ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    private final int mQuality;
66ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    private final int mLatency;
67ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    private final boolean mRequiresNetworkConnection;
68ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    private final Set<String> mFeatures;
69ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
70ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public Voice(String name,
71ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            Locale locale,
72ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            int quality,
73ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            int latency,
74ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            boolean requiresNetworkConnection,
75ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            Set<String> features) {
76ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        this.mName = name;
77ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        this.mLocale = locale;
78ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        this.mQuality = quality;
79ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        this.mLatency = latency;
80ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        this.mRequiresNetworkConnection = requiresNetworkConnection;
81ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        this.mFeatures = features;
82ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
83ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
84ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    private Voice(Parcel in) {
85ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        this.mName = in.readString();
86ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        this.mLocale = (Locale)in.readSerializable();
87ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        this.mQuality = in.readInt();
88ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        this.mLatency = in.readInt();
89ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        this.mRequiresNetworkConnection = (in.readByte() == 1);
90ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        this.mFeatures = new HashSet<String>();
91ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        Collections.addAll(this.mFeatures, in.readStringArray());
92ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
93ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
94ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /**
95ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @hide
96ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     */
97ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    @Override
98ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public void writeToParcel(Parcel dest, int flags) {
99ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        dest.writeString(mName);
100ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        dest.writeSerializable(mLocale);
101ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        dest.writeInt(mQuality);
102ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        dest.writeInt(mLatency);
103ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        dest.writeByte((byte) (mRequiresNetworkConnection ? 1 : 0));
104ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        dest.writeStringList(new ArrayList<String>(mFeatures));
105ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
106ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
107ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /**
108ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @hide
109ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     */
110ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    @Override
111ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public int describeContents() {
112ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return 0;
113ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
114ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
115ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /**
116ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @hide
117ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     */
118ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public static final Parcelable.Creator<Voice> CREATOR = new Parcelable.Creator<Voice>() {
119ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        @Override
120ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        public Voice createFromParcel(Parcel in) {
121ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return new Voice(in);
122ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
123ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
124ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        @Override
125ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        public Voice[] newArray(int size) {
126ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return new Voice[size];
127ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
128ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    };
129ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
130ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
131ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /**
132ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @return The voice's locale
133ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     */
134ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public Locale getLocale() {
135ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return mLocale;
136ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
137ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
138ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /**
139ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @return The voice's quality (higher is better)
140ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #QUALITY_VERY_HIGH
141ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #QUALITY_HIGH
142ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #QUALITY_NORMAL
143ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #QUALITY_LOW
144ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #QUALITY_VERY_LOW
145ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     */
146ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public int getQuality() {
147ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return mQuality;
148ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
149ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
150ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /**
151ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @return The voice's latency (lower is better)
152ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #LATENCY_VERY_LOW
153ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #LATENCY_LOW
154ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #LATENCY_NORMAL
155ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #LATENCY_HIGH
156ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #LATENCY_VERY_HIGH
157ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     */
158ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public int getLatency() {
159ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return mLatency;
160ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
161ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
162ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /**
163ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @return Does the Voice require a network connection to work.
164ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     */
16535c7698a1b17c3e4ca0eae753e68bf069a463d70Przemyslaw Szczepaniak    public boolean isNetworkConnectionRequired() {
166ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return mRequiresNetworkConnection;
167ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
168ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
169ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /**
170ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @return Unique voice name.
171ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     */
172ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public String getName() {
173ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return mName;
174ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
175ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
176ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /**
177ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * Returns the set of features it supports for a given voice.
178ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * Features can either be framework defined, e.g.
179ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * {@link TextToSpeech.Engine#KEY_FEATURE_NETWORK_TIMEOUT_MS} or engine specific.
180ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * Engine specific keys must be prefixed by the name of the engine they
181ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * are intended for. These keys can be used as parameters to
182ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * {@link TextToSpeech#speak(String, int, java.util.HashMap)} and
183ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * {@link TextToSpeech#synthesizeToFile(String, java.util.HashMap, String)}.
184ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     *
185ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * Features values are strings and their values must met restrictions described in their
186ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * documentation.
187ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     *
188ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @return Set instance. May return {@code null} on error.
189ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     */
190ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public Set<String> getFeatures() {
191ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return mFeatures;
192ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
193ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
194ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    @Override
195ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public String toString() {
196ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        StringBuilder builder = new StringBuilder(64);
197ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return builder.append("Voice[Name: ").append(mName)
198ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                .append(", locale: ").append(mLocale)
199ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                .append(", quality: ").append(mQuality)
200ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                .append(", latency: ").append(mLatency)
201ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                .append(", requiresNetwork: ").append(mRequiresNetworkConnection)
202ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                .append(", features: ").append(mFeatures.toString())
203ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                .append("]").toString();
204ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
205ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
206ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    @Override
207ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public int hashCode() {
208ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        final int prime = 31;
209ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        int result = 1;
210ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        result = prime * result + ((mFeatures == null) ? 0 : mFeatures.hashCode());
211ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        result = prime * result + mLatency;
212ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        result = prime * result + ((mLocale == null) ? 0 : mLocale.hashCode());
213ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        result = prime * result + ((mName == null) ? 0 : mName.hashCode());
214ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        result = prime * result + mQuality;
215ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        result = prime * result + (mRequiresNetworkConnection ? 1231 : 1237);
216ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return result;
217ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
218ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
219ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    @Override
220ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public boolean equals(Object obj) {
221ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (this == obj) {
222ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return true;
223ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
224ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (obj == null) {
225ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
226ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
227ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (getClass() != obj.getClass()) {
228ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
229ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
230ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        Voice other = (Voice) obj;
231ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (mFeatures == null) {
232ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            if (other.mFeatures != null) {
233ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                return false;
234ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            }
235ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        } else if (!mFeatures.equals(other.mFeatures)) {
236ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
237ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
238ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (mLatency != other.mLatency) {
239ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
240ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
241ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (mLocale == null) {
242ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            if (other.mLocale != null) {
243ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                return false;
244ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            }
245ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        } else if (!mLocale.equals(other.mLocale)) {
246ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
247ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
248ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (mName == null) {
249ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            if (other.mName != null) {
250ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                return false;
251ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            }
252ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        } else if (!mName.equals(other.mName)) {
253ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
254ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
255ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (mQuality != other.mQuality) {
256ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
257ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
258ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (mRequiresNetworkConnection != other.mRequiresNetworkConnection) {
259ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
260ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
261ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return true;
262ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
263ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak}
264