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