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