2323import android .media .MediaPlayer .OnPreparedListener ;
2424import android .media .MediaPlayer .OnSeekCompleteListener ;
2525import android .os .Handler ;
26+ import android .os .Looper ;
2627import android .os .Message ;
2728import android .util .Log ;
2829
3334import java .util .TimerTask ;
3435
3536/**
36- * <p>HTML5 support class for Audio.
37+ * HTML5 support class for Audio.
38+ *
39+ * This class runs almost entirely on the WebCore thread. The exception is when
40+ * accessing the WebView object to determine whether private browsing is
41+ * enabled.
3742 */
3843class HTML5Audio extends Handler
3944 implements MediaPlayer .OnBufferingUpdateListener ,
@@ -49,7 +54,7 @@ class HTML5Audio extends Handler
4954 // The C++ MediaPlayerPrivateAndroid object.
5055 private int mNativePointer ;
5156 // The private status of the view that created this player
52- private boolean mIsPrivate ;
57+ private IsPrivateBrowsingEnabledGetter mIsPrivateBrowsingEnabledGetter ;
5358
5459 private static int IDLE = 0 ;
5560 private static int INITIALIZED = 1 ;
@@ -82,6 +87,35 @@ public void run() {
8287 }
8388 }
8489
90+ // Helper class to determine whether private browsing is enabled in the
91+ // given WebView. Queries the WebView on the UI thread. Calls to get()
92+ // block until the data is available.
93+ private class IsPrivateBrowsingEnabledGetter {
94+ private boolean mIsReady ;
95+ private boolean mIsPrivateBrowsingEnabled ;
96+ IsPrivateBrowsingEnabledGetter (Looper uiThreadLooper , final WebView webView ) {
97+ new Handler (uiThreadLooper ).post (new Runnable () {
98+ @ Override
99+ public void run () {
100+ synchronized (IsPrivateBrowsingEnabledGetter .this ) {
101+ mIsPrivateBrowsingEnabled = webView .isPrivateBrowsingEnabled ();
102+ mIsReady = true ;
103+ IsPrivateBrowsingEnabledGetter .this .notify ();
104+ }
105+ }
106+ });
107+ }
108+ synchronized boolean get () {
109+ while (!mIsReady ) {
110+ try {
111+ wait ();
112+ } catch (InterruptedException e ) {
113+ }
114+ }
115+ return mIsPrivateBrowsingEnabled ;
116+ }
117+ };
118+
85119 @ Override
86120 public void handleMessage (Message msg ) {
87121 switch (msg .what ) {
@@ -149,7 +183,8 @@ public HTML5Audio(WebViewCore webViewCore, int nativePtr) {
149183 // Save the native ptr
150184 mNativePointer = nativePtr ;
151185 resetMediaPlayer ();
152- mIsPrivate = webViewCore .getWebView ().isPrivateBrowsingEnabled ();
186+ mIsPrivateBrowsingEnabledGetter = new IsPrivateBrowsingEnabledGetter (
187+ webViewCore .getContext ().getMainLooper (), webViewCore .getWebView ());
153188 }
154189
155190 private void resetMediaPlayer () {
@@ -177,13 +212,14 @@ private void setDataSource(String url) {
177212 if (mState != IDLE ) {
178213 resetMediaPlayer ();
179214 }
180- String cookieValue = CookieManager .getInstance ().getCookie (url , mIsPrivate );
215+ String cookieValue = CookieManager .getInstance ().getCookie (
216+ url , mIsPrivateBrowsingEnabledGetter .get ());
181217 Map <String , String > headers = new HashMap <String , String >();
182218
183219 if (cookieValue != null ) {
184220 headers .put (COOKIE , cookieValue );
185221 }
186- if (mIsPrivate ) {
222+ if (mIsPrivateBrowsingEnabledGetter . get () ) {
187223 headers .put (HIDE_URL_LOGS , "true" );
188224 }
189225
0 commit comments