Chromium Code Reviews| Index: content/public/android/java/src/org/chromium/content/browser/MediaSessionImpl.java |
| diff --git a/content/public/android/java/src/org/chromium/content/browser/MediaSessionImpl.java b/content/public/android/java/src/org/chromium/content/browser/MediaSessionImpl.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..db04ad734dbe477677bfc6e4143acada88c99541 |
| --- /dev/null |
| +++ b/content/public/android/java/src/org/chromium/content/browser/MediaSessionImpl.java |
| @@ -0,0 +1,104 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +package org.chromium.content.browser; |
| + |
| +import org.chromium.base.ObserverList; |
| +import org.chromium.base.annotations.CalledByNative; |
| +import org.chromium.base.annotations.JNINamespace; |
| +import org.chromium.content_public.browser.MediaSession; |
| +import org.chromium.content_public.browser.MediaSessionObserver; |
| +import org.chromium.content_public.common.MediaMetadata; |
| + |
| +/** |
| + * The MediaSessionImpl Java wrapper to allow communicating with the native |
| + * MediaSessionImpl object. |
| + */ |
| +@JNINamespace("content") |
| +public class MediaSessionImpl extends MediaSession { |
| + private long mNativeMediaSessionAndroid; |
| + |
| + private ObserverList<MediaSessionObserver> mObservers; |
| + private ObserverList.RewindableIterator<MediaSessionObserver> mObserversIterator; |
| + |
| + @Override |
| + public void addObserver(MediaSessionObserver observer) { |
| + mObservers.addObserver(observer); |
| + } |
| + |
| + @Override |
| + public void removeObserver(MediaSessionObserver observer) { |
| + mObservers.removeObserver(observer); |
| + } |
| + |
| + @Override |
| + public ObserverList.RewindableIterator<MediaSessionObserver> getObserversForTesting() { |
| + return mObservers.rewindableIterator(); |
| + } |
| + |
| + @Override |
| + public void resume() { |
| + nativeResume(mNativeMediaSessionAndroid); |
| + } |
| + |
| + @Override |
| + public void suspend() { |
| + nativeSuspend(mNativeMediaSessionAndroid); |
| + } |
| + |
| + @Override |
| + public void stop() { |
| + nativeStop(mNativeMediaSessionAndroid); |
| + } |
| + |
| + @CalledByNative |
| + private boolean hasObservers() { |
| + return !mObservers.isEmpty(); |
| + } |
| + |
| + @CalledByNative |
| + private void mediaSessionDestroyed() { |
| + for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
| + mObserversIterator.next().mediaSessionDestroyed(); |
| + } |
|
whywhat
2016/10/28 19:14:38
Seems like you could call tearDown from here (or e
|
| + } |
| + |
| + @CalledByNative |
| + private void mediaSessionStateChanged(boolean isControllable, boolean isSuspended) { |
| + for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
| + mObserversIterator.next().mediaSessionStateChanged(isControllable, isSuspended); |
| + } |
| + } |
| + |
| + @CalledByNative |
| + private void mediaSessionMetadataChanged(MediaMetadata metadata) { |
| + for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
| + mObserversIterator.next().mediaSessionMetadataChanged(metadata); |
| + } |
| + } |
| + |
| + @CalledByNative |
| + private static MediaSessionImpl create(long nativeMediaSession) { |
| + return new MediaSessionImpl(nativeMediaSession); |
| + } |
| + |
| + @CalledByNative |
| + private void tearDown() { |
| + for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { |
| + mObserversIterator.next().stopObserving(); |
| + } |
| + mObservers.clear(); |
| + mNativeMediaSessionAndroid = 0; |
| + } |
| + |
| + private MediaSessionImpl(long nativeMediaSession) { |
| + mNativeMediaSessionAndroid = nativeMediaSession; |
| + mObservers = new ObserverList<MediaSessionObserver>(); |
| + mObserversIterator = mObservers.rewindableIterator(); |
| + } |
| + |
| + private native void nativeResume(long nativeMediaSessionAndroid); |
| + private native void nativeSuspend(long nativeMediaSessionAndroid); |
| + private native void nativeStop(long nativeMediaSessionAndroid); |
| +} |