javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/PlayerListenerImpl.java
branchRCL_3
changeset 24 0fd27995241b
child 26 dc7c549001d5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/mmapi_qt/baseline/javasrc/com/nokia/microedition/media/PlayerListenerImpl.java	Tue May 11 16:07:20 2010 +0300
@@ -0,0 +1,266 @@
+/*
+* Copyright (c) 2002-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  This class is player listener implementation
+*
+*/
+
+
+package com.nokia.microedition.media;
+
+import javax.microedition.media.Player;
+import javax.microedition.media.PlayerListener;
+import javax.microedition.media.Control;
+import javax.microedition.media.control.VideoControl;
+import java.util.Vector;
+import java.util.Enumeration;
+//import com.symbian.midp.runtime.MIDletExecutor;
+//import com.symbian.midp.runtime.MIDletInstance;
+import com.nokia.mj.impl.utils.Logger;
+
+
+public class PlayerListenerImpl
+{
+    // PlayerListener event types that come from native side
+    protected static final int E_STARTED = 0;
+    protected static final int E_STOPPED = 1;
+    protected static final int E_STOPPED_AT_TIME = 2;
+    protected static final int E_END_OF_MEDIA = 3;
+    protected static final int E_DURATION_UPDATED = 4;
+    protected static final int E_AUDIO_DEVICE_UNAVAILABLE = 5;
+    protected static final int E_VOLUME_CHANGED = 6;
+    protected static final int E_SIZE_CHANGED = 7;
+    protected static final int E_ERROR = 8;
+    protected static final int E_CLOSED = 9;
+    protected static final int E_RECORD_STARTED = 10;
+    protected static final int E_RECORD_STOPPED = 11;
+    protected static final int E_PRIVATE_DATA_AVAILABLE = 12;
+    protected static final int E_PRIVATE_DATA_OVERWRITTEN = 13;
+    protected static final int E_BUFFERING_STARTED = 14;
+    protected static final int E_BUFFERING_STOPPED = 15;
+    protected static final int E_RECORD_ERROR = 16;
+    // For global volume info
+    protected static final int E_NOKIA_EXTERNAL_VOLUME_EVENT = 17;
+    // for Audio Routing preferences change
+    protected static final int E_AUDIO_ROUTING_PREFERENCE_CHANGED_EVENT = 18;
+
+    private static final String KVideoControlClassName =
+        "javax.microedition.media.control.VideoControl";
+
+    // maps int event types to String event types
+    private static Vector sEventTypes;
+
+    static
+    {
+        sEventTypes = new Vector(19); // there's 17 event types + 1 global volume event + 1 Audio Routing Preference Change Event
+        sEventTypes.addElement(PlayerListener.STARTED); // E_STARTED
+        sEventTypes.addElement(PlayerListener.STOPPED); // E_STOPPED
+        sEventTypes.addElement(PlayerListener.STOPPED_AT_TIME); // E_STOPPED_AT_TIME
+        sEventTypes.addElement(PlayerListener.END_OF_MEDIA); // E_END_OF_MEDIA
+        sEventTypes.addElement(PlayerListener.DURATION_UPDATED); // E_DURATION_UPDATED
+        sEventTypes.addElement(PlayerListener.DEVICE_UNAVAILABLE); //   E_AUDIO_DEVICE_UNAVAILABLE
+        sEventTypes.addElement(PlayerListener.VOLUME_CHANGED); //   E_VOLUME_CHANGED
+        sEventTypes.addElement(PlayerListener.SIZE_CHANGED); // E_SIZE_CHANGED
+        sEventTypes.addElement(PlayerListener.ERROR); // E_ERROR
+        sEventTypes.addElement(PlayerListener.CLOSED); //   E_CLOSED
+        sEventTypes.addElement(PlayerListener.RECORD_STARTED); //   E_RECORD_STARTED
+        sEventTypes.addElement(PlayerListener.RECORD_STOPPED); //   E_RECORD_STOPPED
+        sEventTypes.addElement(null); //    E_PRIVATE_DATA_AVAILABLE
+        sEventTypes.addElement(null); //    E_PRIVATE_DATA_OVERWRITTEN
+        sEventTypes.addElement(PlayerListener.BUFFERING_STARTED); //    E_BUFFERING_STARTED
+        sEventTypes.addElement(PlayerListener.BUFFERING_STOPPED); //    E_BUFFERING_STOPPED
+        sEventTypes.addElement(PlayerListener.RECORD_ERROR);        //  E_RECORD_ERROR
+        sEventTypes.addElement("com.nokia.external.volume.event");  // E_NOKIA_EXTERNAL_VOLUME_EVENT
+        sEventTypes.addElement("com.nokia.audiooutputchange.event");  // E_AUDIO_ROUTING_PREFERENCE_CHANGED_EVENT
+    }
+
+    private Vector iPlayerListeners = new Vector();
+    private Player iPlayer;
+
+    /**
+     * Constructor
+     * @param aPlayer Handle to player
+     */
+    public PlayerListenerImpl(Player aPlayer)
+    {
+        iPlayer = aPlayer;
+    }
+
+    /**
+     * Adds PlayerListener
+     * @param aPlayerListener Listener that will be added
+     * @see PlayerListener
+     */
+    public synchronized void addPlayerListener(PlayerListener aPlayerListener)
+    {
+        if (aPlayerListener == null)
+        {
+            return;
+        }
+        if (!iPlayerListeners.contains(aPlayerListener))
+        {
+            iPlayerListeners.addElement(aPlayerListener);
+        }
+    }
+
+
+    /**
+     * Removes PlayerListener
+     * @param aPlayerListener Listener that will be removed
+     * @see PlayerListener
+     */
+    public synchronized void removePlayerListener(PlayerListener aPlayerListener)
+    {
+        iPlayerListeners.removeElement(aPlayerListener);
+    }
+
+    /**
+     * Deliveres event to all registered PlayerListeners
+     * @param aEventType type defined in PlayerListener
+     * @param aEventData data for event
+     */
+    public synchronized void postEvent(String aEventType, Object aEventData)
+    {
+        Enumeration listeners = iPlayerListeners.elements();
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerListenerImpl.java::PostEvent" + listeners);
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlayerListenerImpl.java::PostEvent" + aEventType + aEventData );
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"PlaerListenerImpl.java::PostEvent, this = "+this +" iPlayerListeners = "+iPlayerListeners);
+        Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"Listeners count = "+iPlayerListeners.size());
+        while (listeners.hasMoreElements())
+        {
+            PlayerListener listener = (PlayerListener)listeners.nextElement();
+            Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"listener = "+listener);
+
+            CallBackThread obj = new CallBackThread(aEventType,aEventData,listener,iPlayer);
+            Thread t = new Thread(obj);
+            t.start();
+        }
+    }
+
+    /**
+     * Posts a long event. Called from native implementation.
+     * @param aEventType Event type
+     * @param aEventData Event data
+     */
+    private void postLongEvent(int aEventType, long aEventData)
+    {
+        // event has come after this has been gc'd
+        if (this == null)
+        {
+            return;
+        }
+        Long eventData = new Long(aEventData);
+        postEvent(getEventType(aEventType), eventData);
+    }
+
+    /**
+     * Posts a string event. Called from native implementation.
+     * @param aEventType Event type
+     * @param aEventData Event data
+     */
+    private void postStringEvent(int aEventType, String aEventData)
+    {
+        // event has come after this has been gc'd
+        if (this == null)
+        {
+            return;
+        }
+        if (aEventType == E_SIZE_CHANGED)
+        {
+            VideoControl vc = (VideoControl)iPlayer.getControl(KVideoControlClassName);
+            postEvent(getEventType(aEventType), vc);
+        }
+        else
+        {
+            postEvent(getEventType(aEventType), aEventData);
+        }
+    }
+
+    /**
+     * Posts object event. Called from native implementation.
+     * @param aEventType Event type
+     * @param aEventData Event data
+     */
+    private void postObjectEvent(int aEventType, Object aEventData)
+    {
+        // event has come after this has been gc'd
+        if (this == null)
+        {
+            return;
+        }
+        postEvent(getEventType(aEventType), aEventData);
+    }
+
+    /**
+     * Posts a control event. Called from native implementation.
+     * @param aEventType Event type
+     * @param aEventData Event data
+     */
+    private void postControlEvent(int aEventType, String aEventData)
+    {
+        // event has come after this has been gc'd
+        if (this == null)
+        {
+            return;
+        }
+        Control eventData = iPlayer.getControl(aEventData);
+        postEvent(getEventType(aEventType), eventData);
+    }
+
+    /**
+     * Converts int eventType to String eventType
+     * @param aEventType event type to be converted
+     * @return converted event type
+     */
+    private String getEventType(int aEventType)
+    {
+        String eventType = null;
+        eventType = (String)sEventTypes.elementAt(aEventType);
+        return eventType;
+    }
+    
+    class CallBackThread extends Thread
+    {
+        private String iEventType;
+        private Object iEventData;
+        private PlayerListener iListener;
+        private Player iPlayer;
+        
+        public CallBackThread(String aEventType, Object aEventData, PlayerListener aListener, Player aPlayer)
+        {
+            iEventType = aEventType;
+            iEventData = aEventData;
+            iListener = aListener;
+            iPlayer = aPlayer;
+            
+            
+        }
+        
+        public void doCallBack()
+        {
+            
+            
+        }
+        public void run()
+        {
+            iListener.playerUpdate(iPlayer,
+                                  iEventType,
+                                  iEventData);  
+                                  
+            Logger.LOG(Logger.EJavaMMAPI, Logger.EInfo,"after calling midlet playerupdate");
+               
+            
+        }   
+        
+    }
+}