Merge "Fix minSdkVersion scanning to not throw warnings"
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 1c980e3..fa6abec 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -3908,16 +3908,16 @@
         }
     }
 
-    final void applyConfigurationToResourcesLocked(Configuration config) {
+    final boolean applyConfigurationToResourcesLocked(Configuration config) {
         if (mResConfiguration == null) {
             mResConfiguration = new Configuration();
         }
         if (!mResConfiguration.isOtherSeqNewer(config)) {
             if (DEBUG_CONFIGURATION) Log.v(TAG, "Skipping new config: curSeq="
                     + mResConfiguration.seq + ", newSeq=" + config.seq);
-            return;
+            return false;
         }
-        mResConfiguration.updateFrom(config);
+        int changes = mResConfiguration.updateFrom(config);
         DisplayMetrics dm = getDisplayMetricsLocked(true);
 
         // set it for java, this also affects newly created Resources
@@ -3948,6 +3948,8 @@
                 it.remove();
             }
         }
+        
+        return changes != 0;
     }
     
     final void handleConfigurationChanged(Configuration config) {
@@ -4522,17 +4524,20 @@
         ViewRoot.addConfigCallback(new ComponentCallbacks() {
             public void onConfigurationChanged(Configuration newConfig) {
                 synchronized (mPackages) {
-                    if (mPendingConfiguration == null ||
-                            mPendingConfiguration.isOtherSeqNewer(newConfig)) {
-                        mPendingConfiguration = newConfig;
-                        
-                        // We need to apply this change to the resources
-                        // immediately, because upon returning the view
-                        // hierarchy will be informed about it.
-                        applyConfigurationToResourcesLocked(newConfig);
+                    // We need to apply this change to the resources
+                    // immediately, because upon returning the view
+                    // hierarchy will be informed about it.
+                    if (applyConfigurationToResourcesLocked(newConfig)) {
+                        // This actually changed the resources!  Tell
+                        // everyone about it.
+                        if (mPendingConfiguration == null ||
+                                mPendingConfiguration.isOtherSeqNewer(newConfig)) {
+                            mPendingConfiguration = newConfig;
+                            
+                            queueOrSendMessage(H.CONFIGURATION_CHANGED, newConfig);
+                        }
                     }
                 }
-                queueOrSendMessage(H.CONFIGURATION_CHANGED, newConfig);
             }
             public void onLowMemory() {
             }
diff --git a/core/jni/android_database_SQLiteDatabase.cpp b/core/jni/android_database_SQLiteDatabase.cpp
index 4e8d05b..36234a9 100644
--- a/core/jni/android_database_SQLiteDatabase.cpp
+++ b/core/jni/android_database_SQLiteDatabase.cpp
@@ -72,8 +72,9 @@
 }
 
 static void sqlLogger(void *databaseName, int iErrCode, const char *zMsg) {
-    LOGI("sqlite returned: database = %s, error code = %d, msg = %s\n",
-            (char *)databaseName, iErrCode, zMsg);
+    // skip printing this message if it is due to certain types of errors
+    if (iErrCode == SQLITE_CONSTRAINT) return;
+    LOGI("sqlite returned: error code = %d, msg = %s\n", iErrCode, zMsg);
 }
 
 // register the logging func on sqlite. needs to be done BEFORE any sqlite3 func is called.
diff --git a/include/tts/TtsEngine.h b/include/tts/TtsEngine.h
index 28b0d2f..998e353 100644
--- a/include/tts/TtsEngine.h
+++ b/include/tts/TtsEngine.h
@@ -26,6 +26,12 @@
 
 namespace android {
 
+#define ANDROID_TTS_ENGINE_PROPERTY_CONFIG "engineConfig"
+#define ANDROID_TTS_ENGINE_PROPERTY_PITCH  "pitch"
+#define ANDROID_TTS_ENGINE_PROPERTY_RATE   "rate"
+#define ANDROID_TTS_ENGINE_PROPERTY_VOLUME "volume"
+
+
 enum tts_synth_status {
     TTS_SYNTH_DONE              = 0,
     TTS_SYNTH_PENDING           = 1
@@ -85,7 +91,7 @@
     // Initialize the TTS engine and returns whether initialization succeeded.
     // @param synthDoneCBPtr synthesis callback function pointer
     // @return TTS_SUCCESS, or TTS_FAILURE
-    virtual tts_result init(synthDoneCB_t synthDoneCBPtr);
+    virtual tts_result init(synthDoneCB_t synthDoneCBPtr, const char *engineConfig);
 
     // Shut down the TTS engine and releases all associated resources.
     // @return TTS_SUCCESS, or TTS_FAILURE
@@ -122,7 +128,7 @@
     // @param variant pointer to the variant code
     // @return TTS_SUCCESS, or TTS_FAILURE
     virtual tts_result loadLanguage(const char *lang, const char *country, const char *variant);
-    
+
     // Load the resources associated with the specified language, country and Locale variant.
     // The loaded language will only be used once a call to setLanguageFromLocale() with the same
     // language value is issued. Language and country values are coded according to the ISO three
@@ -220,19 +226,6 @@
     virtual tts_result synthesizeText(const char *text, int8_t *buffer,
             size_t bufferSize, void *userdata);
 
-    // Synthesize IPA text.
-    // As the synthesis is performed, the engine invokes the callback to notify
-    // the TTS framework that it has filled the given buffer, and indicates how
-    // many bytes it wrote. The callback is called repeatedly until the engine
-    // has generated all the audio data corresponding to the IPA data.
-    // @param ipa      the IPA data to synthesize
-    // @param userdata  pointer to be returned when the call is invoked
-    // @param buffer    the location where the synthesized data must be written
-    // @param bufferSize the number of bytes that can be written in buffer
-    // @return TTS_FEATURE_UNSUPPORTED if IPA is not supported,
-    //         otherwise TTS_SUCCESS or TTS_FAILURE
-    virtual tts_result synthesizeIpa(const char *ipa, int8_t *buffer,
-            size_t bufferSize, void *userdata);
 };
 
 } // namespace android
diff --git a/packages/TtsService/jni/android_tts_SynthProxy.cpp b/packages/TtsService/jni/android_tts_SynthProxy.cpp
index b7acd96..1d69361 100644
--- a/packages/TtsService/jni/android_tts_SynthProxy.cpp
+++ b/packages/TtsService/jni/android_tts_SynthProxy.cpp
@@ -383,7 +383,7 @@
 // ----------------------------------------------------------------------------
 static int
 android_tts_SynthProxy_native_setup(JNIEnv *env, jobject thiz,
-        jobject weak_this, jstring nativeSoLib)
+        jobject weak_this, jstring nativeSoLib, jstring engConfig)
 {
     int result = TTS_FAILURE;
 
@@ -395,6 +395,7 @@
             DEFAULT_TTS_STREAM_TYPE, DEFAULT_TTS_RATE, DEFAULT_TTS_FORMAT, DEFAULT_TTS_NB_CHANNELS);
 
     const char *nativeSoLibNativeString =  env->GetStringUTFChars(nativeSoLib, 0);
+    const char *engConfigString = env->GetStringUTFChars(engConfig, 0);
 
     void *engine_lib_handle = dlopen(nativeSoLibNativeString,
             RTLD_NOW | RTLD_LOCAL);
@@ -409,7 +410,7 @@
 
         if (pJniStorage->mNativeSynthInterface) {
             Mutex::Autolock l(engineMutex);
-            pJniStorage->mNativeSynthInterface->init(ttsSynthDoneCB);
+            pJniStorage->mNativeSynthInterface->init(ttsSynthDoneCB, engConfigString);
         }
 
         result = TTS_SUCCESS;
@@ -422,6 +423,7 @@
     env->SetIntField(thiz, javaTTSFields.synthProxyFieldJniData, (int)pJniStorage);
 
     env->ReleaseStringUTFChars(nativeSoLib, nativeSoLibNativeString);
+    env->ReleaseStringUTFChars(engConfig, engConfigString);
 
     return result;
 }
@@ -482,6 +484,29 @@
     return result;
 }
 
+static int
+android_tts_SynthProxy_setConfig(JNIEnv *env, jobject thiz, jint jniData, jstring engineConfig)
+{
+    int result = TTS_FAILURE;
+
+    if (jniData == 0) {
+        LOGE("android_tts_SynthProxy_setConfig(): invalid JNI data");
+        return result;
+    }
+
+    Mutex::Autolock l(engineMutex);
+
+    SynthProxyJniStorage* pSynthData = (SynthProxyJniStorage*)jniData;
+    const char *engineConfigNativeString = env->GetStringUTFChars(engineConfig, 0);
+
+    if (pSynthData->mNativeSynthInterface) {
+        result = pSynthData->mNativeSynthInterface->setProperty(ANDROID_TTS_ENGINE_PROPERTY_CONFIG,
+                engineConfigNativeString, strlen(engineConfigNativeString));
+    }
+    env->ReleaseStringUTFChars(engineConfig, engineConfigNativeString);
+
+    return result;
+}
 
 static int
 android_tts_SynthProxy_setLanguage(JNIEnv *env, jobject thiz, jint jniData,
@@ -867,6 +892,10 @@
         "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",
         (void*)android_tts_SynthProxy_isLanguageAvailable
     },
+    {   "native_setConfig",
+            "(ILjava/lang/String;)I",
+            (void*)android_tts_SynthProxy_setConfig
+    },
     {   "native_setLanguage",
         "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)I",
         (void*)android_tts_SynthProxy_setLanguage
@@ -896,7 +925,7 @@
         (void*)android_tts_SynthProxy_shutdown
     },
     {   "native_setup",
-        "(Ljava/lang/Object;Ljava/lang/String;)I",
+        "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)I",
         (void*)android_tts_SynthProxy_native_setup
     },
     {   "native_setLowShelf",
diff --git a/packages/TtsService/src/android/tts/SynthProxy.java b/packages/TtsService/src/android/tts/SynthProxy.java
index 5f283e1..2a0bbeb 100755
--- a/packages/TtsService/src/android/tts/SynthProxy.java
+++ b/packages/TtsService/src/android/tts/SynthProxy.java
@@ -51,7 +51,7 @@
     public SynthProxy(String nativeSoLib, String engineConfig) {
         boolean applyFilter = nativeSoLib.toLowerCase().contains("pico");
         Log.v(TtsService.SERVICE_TAG, "About to load "+ nativeSoLib + ", applyFilter="+applyFilter);
-        native_setup(new WeakReference<SynthProxy>(this), nativeSoLib);
+        native_setup(new WeakReference<SynthProxy>(this), nativeSoLib, engineConfig);
         native_setLowShelf(applyFilter, PICO_FILTER_GAIN, PICO_FILTER_LOWSHELF_ATTENUATION,
                 PICO_FILTER_TRANSITION_FREQ, PICO_FILTER_SHELF_SLOPE);
     }
@@ -105,10 +105,10 @@
     }
 
     /**
-     * Sets the engine configuration.
+     * Updates the engine configuration.
      */
     public int setConfig(String engineConfig) {
-        return android.speech.tts.TextToSpeech.SUCCESS;
+        return native_setConfig(engineConfig);
     }
 
     /**
@@ -180,7 +180,8 @@
      */
     private int mJniData = 0;
 
-    private native final int native_setup(Object weak_this, String nativeSoLib);
+    private native final int native_setup(Object weak_this, String nativeSoLib,
+            String engineConfig);
 
     private native final int native_setLowShelf(boolean applyFilter, float filterGain,
             float attenuationInDb, float freqInHz, float slope);
@@ -204,6 +205,8 @@
     private native final int native_loadLanguage(int jniData, String language, String country,
             String variant);
 
+    private native final int native_setConfig(String engineConfig);
+
     private native final int native_setSpeechRate(int jniData, int speechRate);
 
     private native final int native_setPitch(int jniData, int speechRate);
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index 4eb529c..12666927 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -308,13 +308,17 @@
                         }
                     } catch (Exception e) {
                         Slog.e(TAG, "Error configuring interface " + intf + ", :" + e);
+                        try {
+                            nwService.stopAccessPoint();
+                        } catch (Exception ee) {
+                            Slog.e(TAG, "Could not stop AP, :" + ee);
+                        }
                         setWifiApEnabledState(WIFI_AP_STATE_FAILED, 0, DriverAction.DRIVER_UNLOAD);
                         return;
                     }
 
                     if(mCm.tether(intf) != ConnectivityManager.TETHER_ERROR_NO_ERROR) {
                         Slog.e(TAG, "Error tethering "+intf);
-                        setWifiApEnabledState(WIFI_AP_STATE_FAILED, 0, DriverAction.DRIVER_UNLOAD);
                     }
                     break;
                 }