diff options
| -rw-r--r-- | Android.mk | 6 | ||||
| -rw-r--r-- | core/java/android/net/http/EventHandler.java | 5 | ||||
| -rw-r--r-- | core/java/android/net/http/HttpsConnection.java | 5 | ||||
| -rw-r--r-- | core/java/android/net/http/LoggingEventHandler.java | 4 | ||||
| -rw-r--r-- | core/java/android/webkit/CookieManager.java | 40 | ||||
| -rw-r--r-- | core/java/android/webkit/LoadListener.java | 15 | ||||
| -rw-r--r-- | media/java/android/media/MediaScanner.java | 20 | ||||
| -rwxr-xr-x | packages/TtsService/src/android/tts/TtsService.java | 46 | ||||
| -rw-r--r-- | services/java/com/android/server/PowerManagerService.java | 12 | ||||
| -rw-r--r-- | telephony/java/com/android/internal/telephony/cdma/SignalToneUtil.java | 16 | ||||
| -rw-r--r-- | tests/CoreTests/android/core/TestEventHandler.java | 5 |
11 files changed, 148 insertions, 26 deletions
diff --git a/Android.mk b/Android.mk index 728ae467ce3c..275807a5282e 100644 --- a/Android.mk +++ b/Android.mk @@ -332,7 +332,13 @@ framework_docs_LOCAL_JAVA_LIBRARIES := \ framework_docs_LOCAL_MODULE_CLASS := JAVA_LIBRARIES framework_docs_LOCAL_DROIDDOC_HTML_DIR := docs/html +# The since flag (-since N.xml API_LEVEL) is used to add API Level information +# to the reference documentation. Must be in order of oldest to newest. framework_docs_LOCAL_DROIDDOC_OPTIONS := \ + -since ./frameworks/base/api/1.xml 1 \ + -since ./frameworks/base/api/2.xml 2 \ + -since ./frameworks/base/api/3.xml 3 \ + -since ./frameworks/base/api/current.xml Donut \ -error 1 -error 2 -warning 3 -error 4 -error 6 -error 8 \ -overview $(LOCAL_PATH)/core/java/overview.html diff --git a/core/java/android/net/http/EventHandler.java b/core/java/android/net/http/EventHandler.java index 830d1f14cbf3..a035c1923496 100644 --- a/core/java/android/net/http/EventHandler.java +++ b/core/java/android/net/http/EventHandler.java @@ -141,7 +141,10 @@ public interface EventHandler { * SSL certificate error callback. Handles SSL error(s) on the way * up to the user. The callback has to make sure that restartConnection() is called, * otherwise the connection will be suspended indefinitely. + * @return True if the callback can handle the error, which means it will + * call restartConnection() to unblock the thread later, + * otherwise return false. */ - public void handleSslErrorRequest(SslError error); + public boolean handleSslErrorRequest(SslError error); } diff --git a/core/java/android/net/http/HttpsConnection.java b/core/java/android/net/http/HttpsConnection.java index 55b733f3ea6f..8a69d0d9fdff 100644 --- a/core/java/android/net/http/HttpsConnection.java +++ b/core/java/android/net/http/HttpsConnection.java @@ -323,7 +323,10 @@ public class HttpsConnection extends Connection { mSuspended = true; } // don't hold the lock while calling out to the event handler - eventHandler.handleSslErrorRequest(error); + boolean canHandle = eventHandler.handleSslErrorRequest(error); + if(!canHandle) { + throw new IOException("failed to handle "+ error); + } synchronized (mSuspendLock) { if (mSuspended) { try { diff --git a/core/java/android/net/http/LoggingEventHandler.java b/core/java/android/net/http/LoggingEventHandler.java index 1b18651bea8c..bdafa0bed470 100644 --- a/core/java/android/net/http/LoggingEventHandler.java +++ b/core/java/android/net/http/LoggingEventHandler.java @@ -82,9 +82,11 @@ public class LoggingEventHandler implements EventHandler { } } - public void handleSslErrorRequest(SslError error) { + public boolean handleSslErrorRequest(SslError error) { if (HttpLog.LOGV) { HttpLog.v("LoggingEventHandler: handleSslErrorRequest():" + error); } + // return false so that the caller thread won't wait forever + return false; } } diff --git a/core/java/android/webkit/CookieManager.java b/core/java/android/webkit/CookieManager.java index 7b9172487876..c81c4b6a1a71 100644 --- a/core/java/android/webkit/CookieManager.java +++ b/core/java/android/webkit/CookieManager.java @@ -23,9 +23,12 @@ import android.util.Log; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Comparator; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; +import java.util.SortedSet; +import java.util.TreeSet; /** * CookieManager manages cookies according to RFC2109 spec. @@ -190,6 +193,14 @@ public final class CookieManager { } } + private static final CookieComparator COMPARATOR = new CookieComparator(); + + private static final class CookieComparator implements Comparator<Cookie> { + public int compare(Cookie cookie1, Cookie cookie2) { + return cookie2.path.length() - cookie1.path.length(); + } + } + private CookieManager() { } @@ -401,8 +412,8 @@ public final class CookieManager { long now = System.currentTimeMillis(); boolean secure = HTTPS.equals(uri.mScheme); Iterator<Cookie> iter = cookieList.iterator(); - StringBuilder ret = new StringBuilder(256); + SortedSet<Cookie> cookieSet = new TreeSet<Cookie>(COMPARATOR); while (iter.hasNext()) { Cookie cookie = iter.next(); if (cookie.domainMatch(hostAndPath[0]) && @@ -413,19 +424,26 @@ public final class CookieManager { && (!cookie.secure || secure) && cookie.mode != Cookie.MODE_DELETED) { cookie.lastAcessTime = now; + cookieSet.add(cookie); + } + } - if (ret.length() > 0) { - ret.append(SEMICOLON); - // according to RC2109, SEMICOLON is office separator, - // but when log in yahoo.com, it needs WHITE_SPACE too. - ret.append(WHITE_SPACE); - } - - ret.append(cookie.name); - ret.append(EQUAL); - ret.append(cookie.value); + StringBuilder ret = new StringBuilder(256); + Iterator<Cookie> setIter = cookieSet.iterator(); + while (setIter.hasNext()) { + Cookie cookie = setIter.next(); + if (ret.length() > 0) { + ret.append(SEMICOLON); + // according to RC2109, SEMICOLON is official separator, + // but when log in yahoo.com, it needs WHITE_SPACE too. + ret.append(WHITE_SPACE); } + + ret.append(cookie.name); + ret.append(EQUAL); + ret.append(cookie.value); } + if (ret.length() > 0) { if (DebugFlags.COOKIE_MANAGER) { Log.v(LOGTAG, "getCookie: uri: " + uri + " value: " + ret); diff --git a/core/java/android/webkit/LoadListener.java b/core/java/android/webkit/LoadListener.java index 50436d87bfde..7fff0148e5a5 100644 --- a/core/java/android/webkit/LoadListener.java +++ b/core/java/android/webkit/LoadListener.java @@ -104,6 +104,7 @@ class LoadListener extends Handler implements EventHandler { private String mErrorDescription; private SslError mSslError; private RequestHandle mRequestHandle; + private RequestHandle mSslErrorRequestHandle; // Request data. It is only valid when we are doing a load from the // cache. It is needed if the cache returns a redirect @@ -673,7 +674,7 @@ class LoadListener extends Handler implements EventHandler { * IMPORTANT: as this is called from network thread, can't call native * directly */ - public void handleSslErrorRequest(SslError error) { + public boolean handleSslErrorRequest(SslError error) { if (DebugFlags.LOAD_LISTENER) { Log.v(LOGTAG, "LoadListener.handleSslErrorRequest(): url:" + url() + @@ -681,6 +682,15 @@ class LoadListener extends Handler implements EventHandler { " certificate: " + error.getCertificate()); } sendMessageInternal(obtainMessage(MSG_SSL_ERROR, error)); + // if it has been canceled, return false so that the network thread + // won't be blocked. If it is not canceled, save the mRequestHandle + // so that if it is canceled when MSG_SSL_ERROR is handled, we can + // still call handleSslErrorResponse which will call restartConnection + // to unblock the network thread. + if (!mCancelled) { + mSslErrorRequestHandle = mRequestHandle; + } + return !mCancelled; } // Handle the ssl error on the WebCore thread. @@ -688,7 +698,10 @@ class LoadListener extends Handler implements EventHandler { if (!mCancelled) { mSslError = error; Network.getInstance(mContext).handleSslErrorRequest(this); + } else if (mSslErrorRequestHandle != null) { + mSslErrorRequestHandle.handleSslErrorResponse(true); } + mSslErrorRequestHandle = null; } /** diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index 76d8401ab2e8..71af909c36b4 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -681,6 +681,26 @@ public class MediaScanner } values.put(MediaStore.MediaColumns.TITLE, title); } + String album = values.getAsString(Audio.Media.ALBUM); + if (MediaFile.UNKNOWN_STRING.equals(album)) { + album = values.getAsString(MediaStore.MediaColumns.DATA); + // extract last path segment before file name + int lastSlash = album.lastIndexOf('/'); + if (lastSlash >= 0) { + int previousSlash = 0; + while (true) { + int idx = album.indexOf('/', previousSlash + 1); + if (idx < 0 || idx >= lastSlash) { + break; + } + previousSlash = idx; + } + if (previousSlash != 0) { + album = album.substring(previousSlash + 1, lastSlash); + values.put(Audio.Media.ALBUM, album); + } + } + } if (isAudio) { values.put(Audio.Media.IS_RINGTONE, ringtones); values.put(Audio.Media.IS_NOTIFICATION, notifications); diff --git a/packages/TtsService/src/android/tts/TtsService.java b/packages/TtsService/src/android/tts/TtsService.java index 1b99d32cc9c0..70960b5db15d 100755 --- a/packages/TtsService/src/android/tts/TtsService.java +++ b/packages/TtsService/src/android/tts/TtsService.java @@ -142,6 +142,8 @@ public class TtsService extends Service implements OnCompletionListener { private final ReentrantLock synthesizerLock = new ReentrantLock(); private static SynthProxy sNativeSynth = null; + private static Boolean sIsKillingSynth = true; + @Override public void onCreate() { super.onCreate(); @@ -152,6 +154,7 @@ public class TtsService extends Service implements OnCompletionListener { String soLibPath = "/system/lib/libttspico.so"; if (sNativeSynth == null) { sNativeSynth = new SynthProxy(soLibPath); + sIsKillingSynth = false; } mSelf = this; @@ -172,6 +175,9 @@ public class TtsService extends Service implements OnCompletionListener { @Override public void onDestroy() { super.onDestroy(); + + sIsKillingSynth = true; + Log.i("TtsService", "TtsService.onDestroy()"); // Don't hog the media player cleanUpPlayer(); @@ -180,6 +186,7 @@ public class TtsService extends Service implements OnCompletionListener { // Unregister all callbacks. mCallbacks.kill(); + //Log.i("TtsService", "TtsService.onDestroy() ended"); } @@ -243,6 +250,9 @@ public class TtsService extends Service implements OnCompletionListener { private int setSpeechRate(String callingApp, int rate) { + if (sIsKillingSynth) { + return TextToSpeech.ERROR; + } if (isDefaultEnforced()) { return sNativeSynth.setSpeechRate(getDefaultRate()); } else { @@ -252,23 +262,37 @@ public class TtsService extends Service implements OnCompletionListener { private int setPitch(String callingApp, int pitch) { + if (sIsKillingSynth) { + return TextToSpeech.ERROR; + } return sNativeSynth.setPitch(pitch); } private int isLanguageAvailable(String lang, String country, String variant) { + if (sIsKillingSynth) { + return TextToSpeech.LANG_NOT_SUPPORTED; + } //Log.v("TtsService", "TtsService.isLanguageAvailable(" + lang + ", " + country + ", " +variant+")"); return sNativeSynth.isLanguageAvailable(lang, country, variant); } private String[] getLanguage() { + if (sIsKillingSynth) { + Log.v("TtsService", "killing synth:: aborting getLanguage()"); + return null; + } return sNativeSynth.getLanguage(); } private int setLanguage(String callingApp, String lang, String country, String variant) { Log.v("TtsService", "TtsService.setLanguage(" + lang + ", " + country + ", " + variant + ")"); + if (sIsKillingSynth) { + Log.v("TtsService", "killing synth:: aborting setLanguage()"); + return TextToSpeech.ERROR; + } if (isDefaultEnforced()) { return sNativeSynth.setLanguage(getDefaultLanguage(), getDefaultCountry(), getDefaultLocVariant()); @@ -402,7 +426,12 @@ public class TtsService extends Service implements OnCompletionListener { } if ((mCurrentSpeechItem != null) && mCurrentSpeechItem.mCallingApp.equals(callingApp)) { - result = sNativeSynth.stop(); + if (sIsKillingSynth) { + Log.v("TtsService", "killing synth:: aborting stop()"); + result = TextToSpeech.ERROR; + } else { + result = sNativeSynth.stop(); + } mKillList.put(mCurrentSpeechItem, true); if (mPlayer != null) { try { @@ -451,7 +480,12 @@ public class TtsService extends Service implements OnCompletionListener { if ((mCurrentSpeechItem != null) && ((mCurrentSpeechItem.mType != SpeechItem.TEXT_TO_FILE) || mCurrentSpeechItem.mCallingApp.equals(callingApp))) { - result = sNativeSynth.stop(); + if (sIsKillingSynth) { + Log.v("TtsService", "killing synth:: aborting stop()"); + result = TextToSpeech.ERROR; + } else { + result = sNativeSynth.stop(); + } mKillList.put(mCurrentSpeechItem, true); if (mPlayer != null) { try { @@ -591,7 +625,9 @@ public class TtsService extends Service implements OnCompletionListener { if (speechRate.length() > 0){ setSpeechRate("", Integer.parseInt(speechRate)); } - sNativeSynth.speak(speechItem.mText, streamType); + if (!sIsKillingSynth) { + sNativeSynth.speak(speechItem.mText, streamType); + } } } catch (InterruptedException e) { Log.e("TtsService", "TTS speakInternalOnly(): tryLock interrupted"); @@ -660,7 +696,9 @@ public class TtsService extends Service implements OnCompletionListener { if (speechRate.length() > 0){ setSpeechRate("", Integer.parseInt(speechRate)); } - sNativeSynth.synthesizeToFile(speechItem.mText, speechItem.mFilename); + if (!sIsKillingSynth) { + sNativeSynth.synthesizeToFile(speechItem.mText, speechItem.mFilename); + } } } catch (InterruptedException e) { Log.e("TtsService", "TTS synthToFileInternalOnly(): tryLock interrupted"); diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java index a3c34365875b..447e9faea7a8 100644 --- a/services/java/com/android/server/PowerManagerService.java +++ b/services/java/com/android/server/PowerManagerService.java @@ -765,15 +765,17 @@ class PowerManagerService extends IPowerManager.Stub switch (type) { case PowerManager.FULL_WAKE_LOCK: - return "FULL_WAKE_LOCK "; + return "FULL_WAKE_LOCK "; case PowerManager.SCREEN_BRIGHT_WAKE_LOCK: - return "SCREEN_BRIGHT_WAKE_LOCK"; + return "SCREEN_BRIGHT_WAKE_LOCK "; case PowerManager.SCREEN_DIM_WAKE_LOCK: - return "SCREEN_DIM_WAKE_LOCK "; + return "SCREEN_DIM_WAKE_LOCK "; case PowerManager.PARTIAL_WAKE_LOCK: - return "PARTIAL_WAKE_LOCK "; + return "PARTIAL_WAKE_LOCK "; + case PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK: + return "PROXIMITY_SCREEN_OFF_WAKE_LOCK"; default: - return "??? "; + return "??? "; } } diff --git a/telephony/java/com/android/internal/telephony/cdma/SignalToneUtil.java b/telephony/java/com/android/internal/telephony/cdma/SignalToneUtil.java index 44958e950a0d..4b88057f7b71 100644 --- a/telephony/java/com/android/internal/telephony/cdma/SignalToneUtil.java +++ b/telephony/java/com/android/internal/telephony/cdma/SignalToneUtil.java @@ -35,7 +35,12 @@ public class SignalToneUtil { static public final int IS95_CONST_IR_ALERT_MED = 0; static public final int IS95_CONST_IR_ALERT_HIGH = 1; static public final int IS95_CONST_IR_ALERT_LOW = 2; - static public final int TAPIAMSSCDMA_SIGNAL_PITCH_UNKNOWN = 255; + + // Based on 3GPP2 C.S0005-E, seciton 3.7.5.5 Signal, + // set TAPIAMSSCDMA_SIGNAL_PITCH_UNKNOWN to 0 to avoid + // the alert pitch to be involved in hash calculation for + // signal type other than IS54B. + static public final int TAPIAMSSCDMA_SIGNAL_PITCH_UNKNOWN = 0; // public final int int IS95_CONST_IR_SIGNAL_TYPE; static public final int IS95_CONST_IR_SIG_ISDN_NORMAL = 0; @@ -81,6 +86,15 @@ public class SignalToneUtil { (alertPitch < 0) || (signal > 256) || (signal < 0)) { return new Integer(CDMA_INVALID_TONE); } + // Based on 3GPP2 C.S0005-E, seciton 3.7.5.5 Signal, + // the alert pitch field is ignored by the mobile station unless + // SIGNAL_TYPE is '10',IS-54B Alerting. + // Set alert pitch to TAPIAMSSCDMA_SIGNAL_PITCH_UNKNOWN + // so the alert pitch is not involved in hash calculation + // when signal type is not IS-54B. + if (signalType != IS95_CONST_IR_SIGNAL_IS54B) { + alertPitch = TAPIAMSSCDMA_SIGNAL_PITCH_UNKNOWN; + } return new Integer(signalType * 256 * 256 + alertPitch * 256 + signal); } diff --git a/tests/CoreTests/android/core/TestEventHandler.java b/tests/CoreTests/android/core/TestEventHandler.java index 4cfcadeaca99..45f2f69c6006 100644 --- a/tests/CoreTests/android/core/TestEventHandler.java +++ b/tests/CoreTests/android/core/TestEventHandler.java @@ -497,7 +497,7 @@ public class TestEventHandler implements EventHandler { * SSL certificate error callback. Handles SSL error(s) on the way * up to the user. */ - public void handleSslErrorRequest(SslError error) { + public boolean handleSslErrorRequest(SslError error) { int primaryError = error.getPrimaryError(); if (Config.LOGV) { @@ -527,6 +527,9 @@ public class TestEventHandler implements EventHandler { if (expectSslErrors == -1) // && expectSslCertificate == certificate? expects[TEST_SSL_CERTIFICATE_ERROR] = false; + + // return false so that we won't block the thread + return false; } /** |