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    @Override
95ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public void writeToParcel(Parcel dest, int flags) {
96ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        dest.writeString(mName);
97ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        dest.writeSerializable(mLocale);
98ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        dest.writeInt(mQuality);
99ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        dest.writeInt(mLatency);
100ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        dest.writeByte((byte) (mRequiresNetworkConnection ? 1 : 0));
101ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        dest.writeStringList(new ArrayList<String>(mFeatures));
102ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
103ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
104ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    @Override
105ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public int describeContents() {
106ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return 0;
107ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
108ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
109ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public static final Parcelable.Creator<Voice> CREATOR = new Parcelable.Creator<Voice>() {
110ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        @Override
111ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        public Voice createFromParcel(Parcel in) {
112ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return new Voice(in);
113ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
114ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
115ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        @Override
116ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        public Voice[] newArray(int size) {
117ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return new Voice[size];
118ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
119ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    };
120ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
121ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
122ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /**
123ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @return The voice's locale
124ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     */
125ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public Locale getLocale() {
126ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return mLocale;
127ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
128ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
129ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /**
130ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @return The voice's quality (higher is better)
131ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #QUALITY_VERY_HIGH
132ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #QUALITY_HIGH
133ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #QUALITY_NORMAL
134ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #QUALITY_LOW
135ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #QUALITY_VERY_LOW
136ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     */
137ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public int getQuality() {
138ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return mQuality;
139ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
140ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
141ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /**
142ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @return The voice's latency (lower is better)
143ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #LATENCY_VERY_LOW
144ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #LATENCY_LOW
145ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #LATENCY_NORMAL
146ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #LATENCY_HIGH
147ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @see #LATENCY_VERY_HIGH
148ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     */
149ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public int getLatency() {
150ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return mLatency;
151ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
152ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
153ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /**
154ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @return Does the Voice require a network connection to work.
155ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     */
15635c7698a1b17c3e4ca0eae753e68bf069a463d70Przemyslaw Szczepaniak    public boolean isNetworkConnectionRequired() {
157ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return mRequiresNetworkConnection;
158ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
159ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
160ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /**
161ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @return Unique voice name.
162ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     */
163ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public String getName() {
164ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return mName;
165ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
166ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
167ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    /**
168ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * Returns the set of features it supports for a given voice.
169ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * Features can either be framework defined, e.g.
170ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * {@link TextToSpeech.Engine#KEY_FEATURE_NETWORK_TIMEOUT_MS} or engine specific.
171ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * Engine specific keys must be prefixed by the name of the engine they
172ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * are intended for. These keys can be used as parameters to
173ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * {@link TextToSpeech#speak(String, int, java.util.HashMap)} and
174ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * {@link TextToSpeech#synthesizeToFile(String, java.util.HashMap, String)}.
175ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     *
176ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * Features values are strings and their values must met restrictions described in their
177ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * documentation.
178ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     *
179ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     * @return Set instance. May return {@code null} on error.
180ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak     */
181ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public Set<String> getFeatures() {
182ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return mFeatures;
183ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
184ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
185ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    @Override
186ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public String toString() {
187ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        StringBuilder builder = new StringBuilder(64);
188ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return builder.append("Voice[Name: ").append(mName)
189ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                .append(", locale: ").append(mLocale)
190ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                .append(", quality: ").append(mQuality)
191ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                .append(", latency: ").append(mLatency)
192ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                .append(", requiresNetwork: ").append(mRequiresNetworkConnection)
193ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                .append(", features: ").append(mFeatures.toString())
194ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                .append("]").toString();
195ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
196ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
197ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    @Override
198ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public int hashCode() {
199ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        final int prime = 31;
200ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        int result = 1;
201ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        result = prime * result + ((mFeatures == null) ? 0 : mFeatures.hashCode());
202ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        result = prime * result + mLatency;
203ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        result = prime * result + ((mLocale == null) ? 0 : mLocale.hashCode());
204ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        result = prime * result + ((mName == null) ? 0 : mName.hashCode());
205ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        result = prime * result + mQuality;
206ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        result = prime * result + (mRequiresNetworkConnection ? 1231 : 1237);
207ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return result;
208ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
209ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak
210ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    @Override
211ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    public boolean equals(Object obj) {
212ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (this == obj) {
213ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return true;
214ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
215ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (obj == null) {
216ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
217ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
218ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (getClass() != obj.getClass()) {
219ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
220ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
221ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        Voice other = (Voice) obj;
222ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (mFeatures == null) {
223ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            if (other.mFeatures != null) {
224ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                return false;
225ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            }
226ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        } else if (!mFeatures.equals(other.mFeatures)) {
227ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
228ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
229ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (mLatency != other.mLatency) {
230ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
231ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
232ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (mLocale == null) {
233ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            if (other.mLocale != null) {
234ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                return false;
235ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            }
236ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        } else if (!mLocale.equals(other.mLocale)) {
237ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
238ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
239ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (mName == null) {
240ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            if (other.mName != null) {
241ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak                return false;
242ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            }
243ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        } else if (!mName.equals(other.mName)) {
244ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
245ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
246ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (mQuality != other.mQuality) {
247ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
248ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
249ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        if (mRequiresNetworkConnection != other.mRequiresNetworkConnection) {
250ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak            return false;
251ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        }
252ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak        return true;
253ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak    }
254ad6df74ada7c478257425b746588f22eeec199a6Przemyslaw Szczepaniak}
255