Merge "CtsTestServer: Don't always use one port" into jb-dev
diff --git a/suite/audio_quality/test_description/dut_recording_spectrum.xml b/suite/audio_quality/test_description/dut_recording_spectrum.xml
index 0f58deb..2bfe661 100644
--- a/suite/audio_quality/test_description/dut_recording_spectrum.xml
+++ b/suite/audio_quality/test_description/dut_recording_spectrum.xml
@@ -17,22 +17,21 @@
 
 <case name="dut_recording_spectrum" version="1.0" description="Check frequency spectrum for recording">
 	<setup>
-		<!-- input: peak amplitude, duration in msec, sampling rate, low frequency, high frequency, output: generated sound-->
-		<process method="script:gen_random" input="consti:10000,consti:30000,consti:44100,consti:50,consti:6000" output="id:sound1" />
-		<!-- sound id="sound1" type="random:10000:30000" / -->
+		<!-- input: peak amplitude, duration in msec, sampling rate, high frequency, output: generated sound-->
+		<process method="script:gen_random" input="consti:10000,consti:30000,consti:44100,consti:6000" output="id:sound1" />
 		<!--  Only for starting client app early. The data is not used -->
 		<sound id="sound2" type="sin:1:1000:2" preload="1"/>
 	</setup>
 	<action>
 		<sequential repeat="1" index="i">
 			<output device="host" id="sound1" gain="100" sync="start" waitforcompletion="0" />
-			<sequential repeat="1" index="j">
+			<sequential repeat="5" index="j">
 				<input device="host" id="host_in_$j" gain="100" time="6000" sync="start" />
 				<input device="DUT" id="dut_in_$j" gain="100" time="4000" sync="start" />
 			</sequential>
 		</sequential>
-		<sequential repeat="1" index="k">
-			<!-- input: host record, device record, samping rate, low frequency in Hz, high frequency in Hz, allowed error for pass in smaller side, allowed error in bigger side%, output: min value in lower side calculated normalized to 1.0, max value in higher side, calculated TF in mannitude only between low f to high f -->
+		<sequential repeat="5" index="k">
+			<!-- input: host record, device record, samping rate, low frequency in Hz, high frequency in Hz, allowed error for pass in smaller side, allowed error in bigger side%, output: min value in lower side calculated normalized to 1.0, max value in higher side, calculated amplitude ratio in mannitude only between low f to high f -->
 			<process method="script:check_spectrum" input="id:host_in_$k,id:dut_in_$k,consti:44100,consti:200,consti:4000,constf:50.0,constf:100.0" output="val:min_val_$k,val:max_val_$k,id:tf_$k" />
 		</sequential>
 	</action>
diff --git a/suite/audio_quality/test_description/processing/check_spectrum.py b/suite/audio_quality/test_description/processing/check_spectrum.py
index 31b5a5e..913b88c 100644
--- a/suite/audio_quality/test_description/processing/check_spectrum.py
+++ b/suite/audio_quality/test_description/processing/check_spectrum.py
@@ -23,7 +23,7 @@
 sys.path.append(sys.path[0])
 import calc_delay
 
-# check if Transfer Function of DUT / Host signal
+# check if amplitude ratio of DUT / Host signal
 #  lies in the given error boundary
 # input: host record
 #        device record,
@@ -34,35 +34,42 @@
 #        allowed error ih positive side for pass
 # output: min value in negative side, normalized to 1.0
 #         max value in positive side
-#         calculated TF in magnitude (DUT / Host)
+#         calculated amplittude ratio in magnitude (DUT / Host)
 
 def do_check_spectrum(hostData, DUTData, samplingRate, fLow, fHigh, margainLow, margainHigh):
     # reduce FFT resolution to have averaging effects
-    N = 512 if (len(hostData) > 512) else len(hostData)
-    iLow = N * fLow / samplingRate
+    N = 256 if (len(hostData) > 512) else len(hostData)
+    iLow = N * fLow / samplingRate + 1 # 1 for DC
     if iLow > (N / 2 - 1):
         iLow = (N / 2 - 1)
-    iHigh = N * fHigh / samplingRate
-    if iHigh > (N / 2):
-        iHigh = N / 2
+    iHigh = N * fHigh / samplingRate + 1 # 1 for DC
+    if iHigh > (N / 2 + 1):
+        iHigh = N / 2 + 1
     print fLow, iLow, fHigh, iHigh, samplingRate
-    hostFFT = abs(fft.fft(hostData, n = N))[iLow:iHigh]
-    dutFFT = abs(fft.fft(DUTData, n = N))[iLow:iHigh]
-    TF = dutFFT / hostFFT
-    TFmean = sum(TF) / len(TF)
-    TF = TF / TFmean # TF normalized to 1
-    positiveMax = abs(max(TF))
-    negativeMin = abs(min(TF))
+
+    Phh, freqs = plt.psd(hostData, NFFT=N, Fs=samplingRate, Fc=0, detrend=plt.mlab.detrend_none,\
+        window=plt.mlab.window_hanning, noverlap=0, pad_to=None, sides='onesided',\
+        scale_by_freq=False)
+    Pdd, freqs = plt.psd(DUTData, NFFT=N, Fs=samplingRate, Fc=0, detrend=plt.mlab.detrend_none,\
+        window=plt.mlab.window_hanning, noverlap=0, pad_to=None, sides='onesided',\
+        scale_by_freq=False)
+    print len(Phh), len(Pdd)
+    print "Phh", abs(Phh[iLow:iHigh])
+    print "Pdd", abs(Pdd[iLow:iHigh])
+    amplitudeRatio = np.sqrt(abs(Pdd[iLow:iHigh]/Phh[iLow:iHigh]))
+    ratioMean = np.mean(amplitudeRatio)
+    amplitudeRatio = amplitudeRatio / ratioMean
+    print "Normialized ratio", amplitudeRatio
+    print "ration mean for normalization", ratioMean
+    positiveMax = abs(max(amplitudeRatio))
+    negativeMin = abs(min(amplitudeRatio))
     passFail = True if (positiveMax < (margainHigh / 100.0 + 1.0)) and\
         ((1.0 - negativeMin) < margainLow / 100.0) else False
-    TFResult = np.zeros(len(TF), dtype=np.int16)
-    for i in range(len(TF)):
-        TFResult[i] = TF[i] * 256 # make fixed point
-    #freq = np.linspace(0.0, fHigh, num=iHigh, endpoint=False)
-    #plt.plot(freq, abs(fft.fft(hostData, n = N))[:iHigh], freq, abs(fft.fft(DUTData, n = N))[:iHigh])
-    #plt.show()
+    RatioResult = np.zeros(len(amplitudeRatio), dtype=np.int16)
+    for i in range(len(amplitudeRatio)):
+        RatioResult[i] = amplitudeRatio[i] * 256 # make fixed point
     print "positiveMax", positiveMax, "negativeMin", negativeMin
-    return (passFail, negativeMin, positiveMax, TFResult)
+    return (passFail, negativeMin, positiveMax, RatioResult)
 
 def check_spectrum(inputData, inputTypes):
     output = []
@@ -125,10 +132,10 @@
     samplingRate = 44100
     fLow = 500
     fHigh = 15000
-    data = getattr(mod, "do_gen_random")(peakAmpl, durationInMSec, samplingRate, fLow, fHigh,\
-                                         stereo=False)
+    data = getattr(mod, "do_gen_random")(peakAmpl, durationInMSec, samplingRate, fHigh,\
+        stereo=False)
     print len(data)
-    (passFail, minVal, maxVal, TF) = do_check_spectrum(data, data, samplingRate, fLow, fHigh,\
-                                                           1.0, 1.0)
-    plt.plot(TF)
+    (passFail, minVal, maxVal, ampRatio) = do_check_spectrum(data, data, samplingRate, fLow, fHigh,\
+        1.0, 1.0)
+    plt.plot(ampRatio)
     plt.show()
diff --git a/suite/audio_quality/test_description/processing/gen_random.py b/suite/audio_quality/test_description/processing/gen_random.py
index 541c60a..305526a 100644
--- a/suite/audio_quality/test_description/processing/gen_random.py
+++ b/suite/audio_quality/test_description/processing/gen_random.py
@@ -20,32 +20,24 @@
 import scipy.fftpack as fft
 import matplotlib.pyplot as plt
 
-# generate random signal
+# generate random signal with max freq
 # Input: peak amplitude,
 #        duration in msec,
 #        sampling rate HZ
-#        low frequency,
 #        high frequency,
 # Output: generated sound (stereo)
 
-def do_gen_random(peakAmpl, durationInMSec, samplingRate, fLow, fHigh, stereo=True):
+def do_gen_random(peakAmpl, durationInMSec, samplingRate, fHigh, stereo=True):
     samples = durationInMSec * samplingRate / 1000
     result = np.zeros(samples * 2 if stereo else samples, dtype=np.int16)
-    #randomSignal = np.random.random_integers(-peakAmpl, peakAmpl, samples)
-    randomSignal = np.random.normal(scale=peakAmpl *2 / 3, size=samples)
+    randomSignal = np.random.normal(scale = peakAmpl * 2 / 3, size=samples)
     fftData = fft.rfft(randomSignal)
     freqSamples = samples/2
-    iLow = 0 #freqSamples * fLow * 2/ samplingRate + 1
-    #if iLow > freqSamples - 1:
-    #    iLow = freqSamples - 1
     iHigh = freqSamples * fHigh * 2 / samplingRate + 1
-    #print len(randomSignal), len(fftData), fLow, iLow, fHigh, iHigh
+    #print len(randomSignal), len(fftData), fLow, fHigh, iHigh
     if iHigh > freqSamples - 1:
         iHigh = freqSamples - 1
     fftData[0] = 0 # DC
-    #for i in range(iLow - 1):
-    #    fftData[2 * i + 1 ] = 0 # Re
-    #    fftData[2 * i + 2 ] = 0 # Imag
     for i in range(iHigh, freqSamples - 1):
         fftData[ 2 * i + 1 ] = 0
         fftData[ 2 * i + 2 ] = 0
@@ -81,15 +73,13 @@
         inputError = True
     if (inputTypes[3] != TYPE_I64):
         inputError = True
-    if (inputTypes[4] != TYPE_I64):
-        inputError = True
     if inputError:
         output.append(RESULT_ERROR)
         output.append(outputData)
         output.append(outputTypes)
         return output
 
-    result = do_gen_random(inputData[0], inputData[1], inputData[2], inputData[3], inputData[4])
+    result = do_gen_random(inputData[0], inputData[1], inputData[2], inputData[3])
 
     output.append(RESULT_OK)
     outputData.append(result)
@@ -103,8 +93,8 @@
     peakAmplitude = 10000
     samplingRate = 44100
     durationInMSec = 10000
-    fLow = 500
+    #fLow = 500
     fHigh = 15000
-    result = do_gen_random(peakAmplitude, durationInMSec, samplingRate, fLow, fHigh)
+    result = do_gen_random(peakAmplitude, durationInMSec, samplingRate, fHigh)
     plt.plot(result)
     plt.show()
diff --git a/suite/audio_quality/test_description/review/review_dut_recording_spectrum.xml b/suite/audio_quality/test_description/review/review_dut_recording_spectrum.xml
new file mode 100644
index 0000000..b8157be
--- /dev/null
+++ b/suite/audio_quality/test_description/review/review_dut_recording_spectrum.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+
+<case name="review_dut_recording_spectrum" version="1.0" description="Review">
+	<setup>
+		<sound id="sound_host_0" type="file:reports/2012_05_14_09_27_40/dut_recording_spectrum/host_in_0.r2m" />
+		<sound id="sound_dut_0" type="file:reports/2012_05_14_09_27_40/dut_recording_spectrum/dut_in_0.r2m" />
+		<sound id="sound_host_1" type="file:reports/2012_05_14_09_27_40/dut_recording_spectrum/host_in_1.r2m" />
+		<sound id="sound_dut_1" type="file:reports/2012_05_14_09_27_40/dut_recording_spectrum/dut_in_1.r2m" />
+		<sound id="sound_host_2" type="file:reports/2012_05_14_09_27_40/dut_recording_spectrum/host_in_2.r2m" />
+		<sound id="sound_dut_2" type="file:reports/2012_05_14_09_27_40/dut_recording_spectrum/dut_in_2.r2m" />
+		<sound id="sound_host_3" type="file:reports/2012_05_14_09_27_40/dut_recording_spectrum/host_in_3.r2m" />
+		<sound id="sound_dut_3" type="file:reports/2012_05_14_09_27_40/dut_recording_spectrum/dut_in_3.r2m" />
+		<sound id="sound_host_4" type="file:reports/2012_05_14_09_27_40/dut_recording_spectrum/host_in_4.r2m" />
+		<sound id="sound_dut_4" type="file:reports/2012_05_14_09_27_40/dut_recording_spectrum/dut_in_4.r2m" />
+	</setup>
+	<action>
+		<sequential repeat="5" index="k">
+			<!-- input: host record, device record, samping rate, low frequency in Hz, high frequency in Hz, allowed error for pass in smaller side, allowed error in bigger side%, output: min value in lower side calculated normalized to 1.0, max value in higher side, calculated TF in mannitude only between low f to high f -->
+			<process method="script:check_spectrum" input="id:sound_host_$k,id:sound_dut_$k,consti:44100,consti:200,consti:4000,constf:50.0,constf:100.0" output="val:min_val_$k,val:max_val_$k,id:tf_$k" />
+		</sequential>
+	</action>
+	<save report="min_val_.*,max_val_.*" />
+</case>
diff --git a/tests/tests/media/src/android/media/cts/AudioManagerTest.java b/tests/tests/media/src/android/media/cts/AudioManagerTest.java
index ff774e2..d52e699 100644
--- a/tests/tests/media/src/android/media/cts/AudioManagerTest.java
+++ b/tests/tests/media/src/android/media/cts/AudioManagerTest.java
@@ -42,22 +42,25 @@
 import android.content.Context;
 import android.media.AudioManager;
 import android.media.MediaPlayer;
+import android.os.Vibrator;
 import android.provider.Settings;
 import android.telephony.TelephonyManager;
 import android.test.AndroidTestCase;
 import android.view.SoundEffectConstants;
 
-
 public class AudioManagerTest extends AndroidTestCase {
 
     private final static int MP3_TO_PLAY = R.raw.testmp3;
     private final static long TIME_TO_PLAY = 2000;
     private AudioManager mAudioManager;
+    private boolean mHasVibrator;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
         mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+        Vibrator vibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE);
+        mHasVibrator = (vibrator != null) && vibrator.hasVibrator();
     }
 
     public void testMicrophoneMute() throws Exception {
@@ -167,17 +170,18 @@
     public void testVibrateNotification() throws Exception {
         // VIBRATE_SETTING_ON
         mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_ON);
-        assertEquals(VIBRATE_SETTING_ON,
+        assertEquals(mHasVibrator ? VIBRATE_SETTING_ON : VIBRATE_SETTING_OFF,
                 mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION));
         mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
-        assertTrue(mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
+        assertEquals(mHasVibrator, mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
 
         mAudioManager.setRingerMode(RINGER_MODE_SILENT);
         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
 
         mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
-        assertEquals(RINGER_MODE_VIBRATE, mAudioManager.getRingerMode());
-        assertTrue(mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
+        assertEquals(mHasVibrator ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT,
+                mAudioManager.getRingerMode());
+        assertEquals(mHasVibrator, mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
 
         // VIBRATE_SETTING_OFF
         mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_OFF);
@@ -190,13 +194,14 @@
         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
 
         mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
-        assertEquals(RINGER_MODE_VIBRATE, mAudioManager.getRingerMode());
+        assertEquals(mHasVibrator ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT,
+                mAudioManager.getRingerMode());
         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
 
         // VIBRATE_SETTING_ONLY_SILENT
         mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_ONLY_SILENT);
-        assertEquals(VIBRATE_SETTING_ONLY_SILENT, mAudioManager
-                .getVibrateSetting(VIBRATE_TYPE_NOTIFICATION));
+        assertEquals(mHasVibrator ? VIBRATE_SETTING_ONLY_SILENT : VIBRATE_SETTING_OFF,
+                mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION));
         mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
 
@@ -204,34 +209,37 @@
         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
 
         mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
-        assertEquals(RINGER_MODE_VIBRATE, mAudioManager.getRingerMode());
-        assertTrue(mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
+        assertEquals(mHasVibrator ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT,
+                mAudioManager.getRingerMode());
+        assertEquals(mHasVibrator, mAudioManager.shouldVibrate(VIBRATE_TYPE_NOTIFICATION));
 
         // VIBRATE_TYPE_NOTIFICATION
         mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_ON);
-        assertEquals(VIBRATE_SETTING_ON,
+        assertEquals(mHasVibrator ? VIBRATE_SETTING_ON : VIBRATE_SETTING_OFF,
                 mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION));
         mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_OFF);
         assertEquals(VIBRATE_SETTING_OFF, mAudioManager
                 .getVibrateSetting(VIBRATE_TYPE_NOTIFICATION));
         mAudioManager.setVibrateSetting(VIBRATE_TYPE_NOTIFICATION, VIBRATE_SETTING_ONLY_SILENT);
-        assertEquals(VIBRATE_SETTING_ONLY_SILENT,
+        assertEquals(mHasVibrator ? VIBRATE_SETTING_ONLY_SILENT : VIBRATE_SETTING_OFF,
                 mAudioManager.getVibrateSetting(VIBRATE_TYPE_NOTIFICATION));
     }
 
     public void testVibrateRinger() throws Exception {
         // VIBRATE_TYPE_RINGER
         mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_ON);
-        assertEquals(VIBRATE_SETTING_ON, mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER));
+        assertEquals(mHasVibrator ? VIBRATE_SETTING_ON : VIBRATE_SETTING_OFF,
+                mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER));
         mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
-        assertTrue(mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
+        assertEquals(mHasVibrator, mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
 
         mAudioManager.setRingerMode(RINGER_MODE_SILENT);
         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
 
         mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
-        assertEquals(RINGER_MODE_VIBRATE, mAudioManager.getRingerMode());
-        assertTrue(mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
+        assertEquals(mHasVibrator ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT,
+                mAudioManager.getRingerMode());
+        assertEquals(mHasVibrator, mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
 
         // VIBRATE_SETTING_OFF
         mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_OFF);
@@ -243,7 +251,8 @@
         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
 
         mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
-        assertEquals(RINGER_MODE_VIBRATE, mAudioManager.getRingerMode());
+        assertEquals(mHasVibrator ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT,
+                mAudioManager.getRingerMode());
         // Note: as of Froyo, if VIBRATE_TYPE_RINGER is set to OFF, it will
         // not vibrate, even in RINGER_MODE_VIBRATE. This allows users to
         // disable the vibration for incoming calls only.
@@ -251,8 +260,8 @@
 
         // VIBRATE_SETTING_ONLY_SILENT
         mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_ONLY_SILENT);
-        assertEquals(VIBRATE_SETTING_ONLY_SILENT, mAudioManager
-                .getVibrateSetting(VIBRATE_TYPE_RINGER));
+        assertEquals(mHasVibrator ? VIBRATE_SETTING_ONLY_SILENT : VIBRATE_SETTING_OFF,
+                mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER));
         mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
 
@@ -260,16 +269,18 @@
         assertFalse(mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
 
         mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
-        assertEquals(RINGER_MODE_VIBRATE, mAudioManager.getRingerMode());
-        assertTrue(mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
+        assertEquals(mHasVibrator ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT,
+                mAudioManager.getRingerMode());
+        assertEquals(mHasVibrator, mAudioManager.shouldVibrate(VIBRATE_TYPE_RINGER));
 
         // VIBRATE_TYPE_NOTIFICATION
         mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_ON);
-        assertEquals(VIBRATE_SETTING_ON, mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER));
+        assertEquals(mHasVibrator ? VIBRATE_SETTING_ON : VIBRATE_SETTING_OFF,
+                mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER));
         mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_OFF);
         assertEquals(VIBRATE_SETTING_OFF, mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER));
         mAudioManager.setVibrateSetting(VIBRATE_TYPE_RINGER, VIBRATE_SETTING_ONLY_SILENT);
-        assertEquals(VIBRATE_SETTING_ONLY_SILENT,
+        assertEquals(mHasVibrator ? VIBRATE_SETTING_ONLY_SILENT : VIBRATE_SETTING_OFF,
                 mAudioManager.getVibrateSetting(VIBRATE_TYPE_RINGER));
     }
 
@@ -281,7 +292,8 @@
         assertEquals(RINGER_MODE_SILENT, mAudioManager.getRingerMode());
 
         mAudioManager.setRingerMode(RINGER_MODE_VIBRATE);
-        assertEquals(RINGER_MODE_VIBRATE, mAudioManager.getRingerMode());
+        assertEquals(mHasVibrator ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT,
+                mAudioManager.getRingerMode());
     }
 
     public void testVolume() throws Exception {
@@ -291,19 +303,14 @@
                           AudioManager.STREAM_VOICE_CALL,
                           AudioManager.STREAM_RING };
 
-        // set ringer mode to back normal to not interfere with volume tests
-        mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
-
-        TelephonyManager tm =
-            (TelephonyManager)mContext.getSystemService(Context.TELEPHONY_SERVICE);
-        //FIXME: use TelephonyManager.isVoiceCapable() when public
-        boolean voiceCapable = tm.getPhoneType() != TelephonyManager.PHONE_TYPE_NONE;
-
         mAudioManager.adjustVolume(ADJUST_RAISE, 0);
         mAudioManager.adjustSuggestedStreamVolume(
                 ADJUST_LOWER, USE_DEFAULT_STREAM_TYPE, 0);
 
         for (int i = 0; i < streams.length; i++) {
+            // set ringer mode to back normal to not interfere with volume tests
+            mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
+
             int maxVolume = mAudioManager.getStreamMaxVolume(streams[i]);
 
             mAudioManager.setStreamVolume(streams[i], 1, 0);
@@ -318,23 +325,15 @@
 
             // volume lower
             mAudioManager.setStreamVolume(streams[i], maxVolume, 0);
-            for (int k = maxVolume; k > 1; k--) {
+            for (int k = maxVolume; k > 0; k--) {
                 mAudioManager.adjustStreamVolume(streams[i], ADJUST_LOWER, 0);
                 assertEquals(k - 1, mAudioManager.getStreamVolume(streams[i]));
             }
-            // on voice capable devices, ring and notification volumes cannot be set to 0
-            // by continous press on volume minus key
-            // simulate volume key release
-            mAudioManager.adjustStreamVolume(streams[i], ADJUST_SAME, FLAG_ALLOW_RINGER_MODES);
-            mAudioManager.adjustStreamVolume(streams[i], ADJUST_LOWER, 0);
-            assertEquals(0, mAudioManager.getStreamVolume(streams[i]));
 
-            // set ringer mode to back normal to not interfere with volume tests
-            mAudioManager.setRingerMode(RINGER_MODE_NORMAL);
-
+            mAudioManager.adjustStreamVolume(streams[i], ADJUST_SAME, 0);
             // volume raise
-            mAudioManager.setStreamVolume(streams[i], 0, 0);
-            for (int k = 0; k < maxVolume; k++) {
+            mAudioManager.setStreamVolume(streams[i], 1, 0);
+            for (int k = 1; k < maxVolume; k++) {
                 mAudioManager.adjustStreamVolume(streams[i], ADJUST_RAISE, 0);
                 assertEquals(1 + k, mAudioManager.getStreamVolume(streams[i]));
             }
diff --git a/tests/tests/os/src/android/os/cts/BuildVersionTest.java b/tests/tests/os/src/android/os/cts/BuildVersionTest.java
index 6cb09bb..f001168 100644
--- a/tests/tests/os/src/android/os/cts/BuildVersionTest.java
+++ b/tests/tests/os/src/android/os/cts/BuildVersionTest.java
@@ -29,8 +29,8 @@
 
     private static final String LOG_TAG = "BuildVersionTest";
     private static final Set<String> EXPECTED_RELEASES =
-            new HashSet<String>(Arrays.asList("4.0.3", "4.0.4"));
-    private static final int EXPECTED_SDK = 15;
+            new HashSet<String>(Arrays.asList("4.1"));
+    private static final int EXPECTED_SDK = 16;
 
     @SuppressWarnings("deprecation")
     public void testReleaseVersion() {
diff --git a/tests/tests/security/src/android/security/cts/KernelSettingsTest.java b/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
index 7198241..1e6d384 100644
--- a/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
+++ b/tests/tests/security/src/android/security/cts/KernelSettingsTest.java
@@ -58,6 +58,17 @@
         }
     }
 
+    /**
+     * setuid programs should not be dumpable.
+     */
+    public void testSetuidDumpable() throws IOException {
+        try {
+            assertEquals("0", getFile("/proc/sys/fs/suid_dumpable"));
+        } catch (FileNotFoundException e) {
+            // Odd. The file doesn't exist... Assume we're ok.
+        }
+    }
+
     private String getFile(String filename) throws IOException {
         BufferedReader in = null;
         try {
diff --git a/tests/tests/view/src/android/view/cts/ViewTest.java b/tests/tests/view/src/android/view/cts/ViewTest.java
index 94aed3f..db20614 100644
--- a/tests/tests/view/src/android/view/cts/ViewTest.java
+++ b/tests/tests/view/src/android/view/cts/ViewTest.java
@@ -3356,6 +3356,11 @@
         public void childAccessibilityStateChanged(View child) {
 
         }
+
+        @Override
+        public View findViewToTakeAccessibilityFocusFromHover(View child, View descendant) {
+            return null;
+        }
     }
 
     private final class OnCreateContextMenuListenerImpl implements OnCreateContextMenuListener {