package com.iwedia.gui.dual_video; import android.os.Handler; import android.os.Message; import android.os.RemoteException; import android.util.Log; import android.view.View; import com.iwedia.comm.content.Content; import com.iwedia.comm.content.IContentListControl; import com.iwedia.comm.content.multimedia.MultimediaContent; import com.iwedia.comm.enums.FilterType; import com.iwedia.dtv.service.SourceType; import com.iwedia.gui.MainActivity; import com.iwedia.gui.R; import com.iwedia.gui.components.A4TVToast; import com.iwedia.gui.components.A4TVVideoView; import com.iwedia.gui.content_list.AllHandler; import com.iwedia.gui.listeners.A4TVVideoViewSecondaryPAPOnPreparedListener; import com.iwedia.gui.listeners.A4TVVideoViewSecondaryPIPOnPreparedListener; import com.iwedia.gui.listeners.MainKeyListener; import com.iwedia.gui.osd.OSDGlobal; import com.iwedia.gui.osd.OSDHandlerHelper; public class DualVideoManager { public static final String TAG = "DualVideoManager"; private MainActivity activity; public static pvrStopHandler syncPVRHandle; /** Default constructor */ public DualVideoManager(MainActivity activity) { this.activity = activity; syncPVRHandle = new pvrStopHandler(); } public A4TVVideoView getPrimaryDisplayUnit() { return activity.getPrimaryVideoView(); } public A4TVVideoView getSecondaryDisplayUnit() { return activity.getSecondaryVideoView(); } /** Play content in primary display unit */ public boolean play(Content content) { return false; } /** Play content in PiP */ public boolean playPiP(Content content) { // Get clicked content object and indicate secondary display playback Boolean isContentActive = false; Log.d(TAG, "playPiP "); try { IContentListControl contentListControl = MainActivity.service .getContentListControl(); Content secondaryContent = contentListControl .getActiveContent(MainActivity.SECONDARY_DISPLAY_UNIT_ID); Content primaryContent = contentListControl .getActiveContent(MainActivity.PRIMARY_DISPLAY_UNIT_ID); if (secondaryContent != null) { Log.d(TAG, "playPiP - secondary: " + secondaryContent.toString()); } else { Log.d(TAG, "playPiP - secondary is null"); } if (content == null) { Log.e(TAG, "playPiP - Not valid content - null"); return false; } if (!checkSupportedScenario(content, MainActivity.SECONDARY_DISPLAY_UNIT_ID)) { return false; } if (secondaryContent != null) { isContentActive = content.equals(secondaryContent); Log.d(TAG, "playPiP - isContentActive: " + isContentActive); } if (!isContentActive) { // ////////////////////////////////////////////////////////////////////// // The requestet content is not active in secondary display unit // (PIP or PAP) */ // ////////////////////////////////////////////////////////////////////// if (null != secondaryContent) { // ////////////////////////////////////////////////////////////////////// // A content is active in secondary display unit (PIP or // PAP) */ // ////////////////////////////////////////////////////////////////////// Log.d(TAG, "playPiP - Switching to content: " + content.toString()); Log.d(TAG, "playPiP - Stopping already active content: " + secondaryContent.toString()); stopContent(secondaryContent, MainActivity.SECONDARY_DISPLAY_UNIT_ID, true); if (secondaryContent.getFilterType() == FilterType.PVR_RECORDED) { // Waiting for stop event Log.d(TAG, "playPiP - Wait for PVR_STOP EVENT ... "); Log.d(TAG, "playPiP - Next state ... PIP_DISPLAY_MODE"); syncPVRHandle.waitAndSynchronize(content, A4TVVideoView.PIP_DISPLAY_MODE); MainKeyListener.returnToStoredAppState(); MainActivity.activity.getMultimediaHandler() .closeMultimedia(); return false; } getSecondaryDisplayUnit().hide(); /* if previous content active in PAP, enable HbbTV */ if ((getSecondaryDisplayUnit().getPlayMode() == A4TVVideoView.PAP_DISPLAY_MODE) && (primaryContent.getSourceType() != SourceType.ANALOG) && (primaryContent.getFilterType() != FilterType.INPUTS)) { /* Enable HbbTV */ MainActivity.activity.enableHbbTV(); } } // ////////////////////////////////////////////////////////////////////// // No content is active in secondary display unit (PIP or PAP) // */ // ////////////////////////////////////////////////////////////////////// Log.d(TAG, "playPiP - Play content: " + content.toString()); if (MainActivity.activity.getPrimaryMultimediaVideoView() == null) { getPrimaryDisplayUnit().setScaling(0, 0, 1920, 1080); } if (content.getFilterType() != FilterType.MULTIMEDIA) { getSecondaryDisplayUnit().setOnPreparedListener( new A4TVVideoViewSecondaryPIPOnPreparedListener( getSecondaryDisplayUnit(), content)); getSecondaryDisplayUnit().updateVisibility(View.VISIBLE); } else { playContent(content, MainActivity.SECONDARY_DISPLAY_UNIT_ID, true); getSecondaryDisplayUnit().setPlayMode( A4TVVideoView.PIP_DISPLAY_MODE); } } else { // ////////////////////////////////////////////////////////////////////// // The same content in already secondary display unit (PIP) */ // ////////////////////////////////////////////////////////////////////// if (getSecondaryDisplayUnit().getPlayMode() == A4TVVideoView.PIP_DISPLAY_MODE) { Log.d(TAG, "playPiP - Already running in PIP, stopping content: " + content.toString()); stop(MainActivity.SECONDARY_DISPLAY_UNIT_ID); } else { // ////////////////////////////////////////////////////////////////////// // There same content in already secondary display unit // (PAP) */ // ////////////////////////////////////////////////////////////////////// Log.d(TAG, "playPiP - Switching the content from PAP to PIP: " + content.toString()); if (MainActivity.activity.getPrimaryMultimediaVideoView() == null) { getPrimaryDisplayUnit().setScaling(0, 0, 1920, 1080); } MainActivity.activity.updatePIPCoordinates(); getSecondaryDisplayUnit().gotoPIP(); getSecondaryDisplayUnit().setPlayMode( A4TVVideoView.PIP_DISPLAY_MODE); if ((primaryContent.getSourceType() != SourceType.ANALOG) && (primaryContent.getFilterType() != FilterType.INPUTS)) { /* Enable HbbTV */ MainActivity.activity.enableHbbTV(); } } } return true; } catch (Exception e) { e.printStackTrace(); } return false; } /** Play content in PaP */ public boolean playPaP(Content content) { // Get clicked content object and indicate secondary display playback Boolean isContentActive = false; Log.d(TAG, "playPaP "); try { IContentListControl contentListControl = MainActivity.service .getContentListControl(); Content secondaryContent = contentListControl .getActiveContent(MainActivity.SECONDARY_DISPLAY_UNIT_ID); Content primaryContent = contentListControl .getActiveContent(MainActivity.PRIMARY_DISPLAY_UNIT_ID); if (primaryContent != null) { Log.d(TAG, "playPaP - primary: " + primaryContent.toString()); } if (secondaryContent != null) { Log.d(TAG, "playPaP - secondary: " + secondaryContent.toString()); } if (content == null) { Log.e(TAG, "playPaP Not valid content - null"); return false; } if (!checkSupportedScenario(content, MainActivity.SECONDARY_DISPLAY_UNIT_ID)) { return false; } Log.d(TAG, "playPaP - contentToPlay: " + content.toString()); if (secondaryContent != null) { isContentActive = content.equals(secondaryContent); Log.d(TAG, "playPaP - isContentActive: " + isContentActive); } if (!isContentActive) { if (null != secondaryContent) { // ////////////////////////////////////////////////////////////////////// // There is a content already active in secondary display // unit (PIP or PAP) */ // ////////////////////////////////////////////////////////////////////// Log.d(TAG, "playPaP - Switching to content: " + content.toString()); Log.d(TAG, "playPaP - Stopping already active content: " + secondaryContent.toString()); stopContent(secondaryContent, MainActivity.SECONDARY_DISPLAY_UNIT_ID, false); if (secondaryContent.getFilterType() == FilterType.PVR_RECORDED) { // Waiting for stop event Log.d(TAG, "playPaP - Wait for PVR_STOP EVENT ... "); Log.d(TAG, "playPaP - Next state ... PAP_DISPLAY_MODE"); syncPVRHandle.waitAndSynchronize(content, A4TVVideoView.PAP_DISPLAY_MODE); MainKeyListener.returnToStoredAppState(); MainActivity.activity.getMultimediaHandler() .closeMultimedia(); return false; } getSecondaryDisplayUnit().hide(); } /* Disable HbbTV */ MainActivity.activity.disableHbbTV(); Log.d(TAG, "playPaP - Play content: " + content.toString()); if (MainActivity.activity.getPrimaryMultimediaVideoView() == null) { getPrimaryDisplayUnit().setScaling(0, 0, 960, 1080); } if (content.getFilterType() != FilterType.MULTIMEDIA) { getSecondaryDisplayUnit().setOnPreparedListener( new A4TVVideoViewSecondaryPAPOnPreparedListener( getSecondaryDisplayUnit(), content)); getSecondaryDisplayUnit().updateVisibility(View.VISIBLE); } else { playContent(content, MainActivity.SECONDARY_DISPLAY_UNIT_ID, false); getSecondaryDisplayUnit().setPlayMode( A4TVVideoView.PAP_DISPLAY_MODE); } } else { // ////////////////////////////////////////////////////////////////////// // There same content in already secondary display unit (PAP) */ // ////////////////////////////////////////////////////////////////////// if (getSecondaryDisplayUnit().getPlayMode() == A4TVVideoView.PAP_DISPLAY_MODE) { Log.d(TAG, "playPaP - Already running in PIP, stopping content: " + content.toString()); stop(MainActivity.SECONDARY_DISPLAY_UNIT_ID); } else { // ////////////////////////////////////////////////////////////////////// // There same content in already secondary display unit // (PIP) */ // ////////////////////////////////////////////////////////////////////// if (!checkSupportedScenario(content, MainActivity.SECONDARY_DISPLAY_UNIT_ID)) { return false; } Log.d(TAG, "playPaP - Switching the content from PIP to PAP: " + content.toString()); if (MainActivity.activity.getPrimaryMultimediaVideoView() == null) { getPrimaryDisplayUnit().setScaling(0, 0, 960, 1080); } getSecondaryDisplayUnit().gotoPaP( MainActivity.SECONDARY_DISPLAY_UNIT_ID); getSecondaryDisplayUnit().setPlayMode( A4TVVideoView.PAP_DISPLAY_MODE); /* Disable HbbTV */ MainActivity.activity.disableHbbTV(); } } return true; } catch (Exception e) { e.printStackTrace(); } return false; } private boolean stopContent(Content content, int displayID, boolean isPiP) { Log.d(TAG, "stopContent: " + content.toString()); if (content.getFilterType() == FilterType.MULTIMEDIA) { // Multimedia (dlna playback) - stop Log.d(TAG, "stopContent - Stopping multimedia content: " + content.toString()); if (isPiP) { MainActivity.activity .stopMultimediaVideo(MainActivity.MULTIMEDIA_PIP); } else { MainActivity.activity .stopMultimediaVideo(MainActivity.MULTIMEDIA_PAP); } try { MainActivity.service.getContentListControl().setActiveContent( null, MainActivity.SECONDARY_DISPLAY_UNIT_ID); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else if (content.getFilterType() == FilterType.PVR_RECORDED) { // PVR playback - stop Log.d(TAG, "stopContent - Stopping PVR content: " + content.toString()); try { MainActivity.service.getPvrControl().stopPlayback(); } catch (RemoteException e) { e.printStackTrace(); return false; } } else { // Regular TV content or input - stop Log.d(TAG, "stopContent - Stopping live/input content: " + content.toString()); try { MainActivity.service.getContentListControl().stopContent( content, displayID); } catch (RemoteException e) { e.printStackTrace(); return false; } } return true; } public boolean playContent(Content content, int displayID, boolean isPiP) { Log.d(TAG, "playContent: " + content.toString()); if (content.getFilterType() == FilterType.MULTIMEDIA) { // Multimedia (dlna playback) - play Log.d(TAG, "playContent - play multimedia content: " + content.toString()); if (isPiP) { MainActivity.activity.playMultimediaVideo( ((MultimediaContent) content).getFileURL(), MainActivity.MULTIMEDIA_PIP); } else { MainActivity.activity.playMultimediaVideo( ((MultimediaContent) content).getFileURL(), MainActivity.MULTIMEDIA_PAP); } try { MainActivity.service.getContentListControl().setActiveContent( content, MainActivity.SECONDARY_DISPLAY_UNIT_ID); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else if (content.getFilterType() == FilterType.PVR_RECORDED) { // PVR playback - play Log.d(TAG, "playContent - play PVR content: " + content.toString()); try { MainActivity.service.getPvrControl().startPlayback( MainActivity.SECONDARY_DISPLAY_UNIT_ID, content.getIndex()); MainActivity.service.getContentListControl().setActiveContent( content, MainActivity.SECONDARY_DISPLAY_UNIT_ID); } catch (RemoteException e) { e.printStackTrace(); } } else { // Regular TV content or input - play Log.d(TAG, "playContent - live/input content: " + content.toString()); AllHandler.contentHelper.goContent(content, displayID); } return true; } /** Stop content in given display unit */ public boolean stop(int displayID) { Log.d(TAG, "stop dual video"); try { Content primaryContent = MainActivity.service .getContentListControl().getActiveContent( MainActivity.PRIMARY_DISPLAY_UNIT_ID); Content secondaryContent = MainActivity.service .getContentListControl().getActiveContent( MainActivity.SECONDARY_DISPLAY_UNIT_ID); if ((secondaryContent != null) && (displayID == MainActivity.SECONDARY_DISPLAY_UNIT_ID)) { if (getSecondaryDisplayUnit().getPlayMode() == A4TVVideoView.PIP_DISPLAY_MODE) { Log.d(TAG, "stop pip - Stopping content: " + secondaryContent.toString()); stopContent(secondaryContent, displayID, true); if (secondaryContent.getFilterType() == FilterType.PVR_RECORDED) { // Waiting for stop event Log.d(TAG, "stop - Wait for PVR_STOP EVENT ... "); Log.d(TAG, "stop - Next state ... NONE_DISPLAY_MODE"); syncPVRHandle.waitAndSynchronize(secondaryContent, A4TVVideoView.NONE_DISPLAY_MODE); return true; } getSecondaryDisplayUnit().hide(); getSecondaryDisplayUnit().setPlayMode( A4TVVideoView.NONE_DISPLAY_MODE); return true; } else if (getSecondaryDisplayUnit().getPlayMode() == A4TVVideoView.PAP_DISPLAY_MODE) { Log.d(TAG, "stop pap - Stopping content: " + secondaryContent.toString()); if ((primaryContent.getSourceType() != SourceType.ANALOG) && (primaryContent.getFilterType() != FilterType.INPUTS)) { MainActivity.activity.enableHbbTV(); } stopContent(secondaryContent, displayID, false); if (MainActivity.activity.getPrimaryMultimediaVideoView() == null) { getPrimaryDisplayUnit().setScaling(0, 0, 1920, 1080); } if (secondaryContent.getFilterType() == FilterType.PVR_RECORDED) { // Waiting for stop event Log.d(TAG, "stop - Wait for PVR_STOP EVENT ... "); Log.d(TAG, "stop - Next state ... NONE_DISPLAY_MODE"); syncPVRHandle.waitAndSynchronize(secondaryContent, A4TVVideoView.NONE_DISPLAY_MODE); return true; } getSecondaryDisplayUnit().hide(); getSecondaryDisplayUnit().setPlayMode( A4TVVideoView.NONE_DISPLAY_MODE); return true; } } else { // TODO if renderer there is no active content but PIP is // active? } } catch (RemoteException e) { e.printStackTrace(); } return false; }; public boolean isPiP() { if (getSecondaryDisplayUnit().getPlayMode() == A4TVVideoView.PIP_DISPLAY_MODE) { return true; } else { return false; } } public boolean isPaP() { if (getSecondaryDisplayUnit().getPlayMode() == A4TVVideoView.PAP_DISPLAY_MODE) { return true; } else { return false; } } /** Check if content can be played in given display unit in current scenario */ public boolean checkSupportedScenario(Content content, int displayID) { boolean dualScenarioSupported = true; try { IContentListControl contentListControl = MainActivity.service .getContentListControl(); Content clickedContent = content; Content primaryContent = contentListControl .getActiveContent(MainActivity.PRIMARY_DISPLAY_UNIT_ID); Content secondaryContent; A4TVToast toast = new A4TVToast(MainActivity.activity); if (displayID == 0) { if (null != contentListControl .getActiveContent(MainActivity.SECONDARY_DISPLAY_UNIT_ID)) { secondaryContent = contentListControl.getActiveContent(1); if ((((SourceType.ANALOG == content.getSourceType()) || (FilterType.INPUTS == clickedContent .getFilterType())) && ((SourceType.ANALOG == secondaryContent .getSourceType()) || (FilterType.INPUTS == secondaryContent .getFilterType())))) { dualScenarioSupported = false; } } } else { // displayID == 1 (PIP) /** * Conetents not allowed in secondary display (second analog * content, widget or application) */ if ((((SourceType.ANALOG == primaryContent.getSourceType()) || (FilterType.INPUTS == primaryContent .getFilterType())) && ((SourceType.ANALOG == clickedContent .getSourceType()) || (FilterType.INPUTS == clickedContent .getFilterType()))) || (FilterType.WIDGETS == clickedContent .getFilterType())) { dualScenarioSupported = false; } else if ((OSDHandlerHelper.getHandlerState() == OSDGlobal.PVR_STATE_PLAY_TIME_SHIFT || OSDHandlerHelper.getHandlerState() == OSDGlobal.PVR_STATE_PAUSE_TIME_SHIFT || OSDHandlerHelper.getHandlerState() == OSDGlobal.PVR_STATE_REW_TIME_SHIFT || OSDHandlerHelper .getHandlerState() == OSDGlobal.PVR_STATE_FF_TIME_SHIFT) && (clickedContent.getFilterType() == FilterType.PVR_RECORDED)) { /** * Conetents not allowed in secondary display (PVR Playback * if main in timeshift or PVR playback mode) */ dualScenarioSupported = false; } else if (((activity.getPrimaryMultimediaVideoView() != null) && (activity .getMultimediaMode() == MainActivity.MULTIMEDIA_MAIN)) && content.getFilterType() == FilterType.MULTIMEDIA) { /** * Cannot play two multimedia - temp */ dualScenarioSupported = false; } else if ((OSDHandlerHelper.getHandlerState() == OSDGlobal.PVR_STATE_PLAY_PLAY_BACK || OSDHandlerHelper.getHandlerState() == OSDGlobal.PVR_STATE_PAUSE_PLAY_BACK || OSDHandlerHelper.getHandlerState() == OSDGlobal.PVR_STATE_FF_PLAY_BACK || OSDHandlerHelper .getHandlerState() == OSDGlobal.PVR_STATE_REW_PLAY_BACK) && content.getFilterType() == FilterType.PVR_RECORDED) { /** * Cannot play two PVR playbacks */ dualScenarioSupported = false; } } if (dualScenarioSupported == false) { Log.d(TAG, "MPQ is not supporting such scenario!!"); toast.showToast(R.string.not_supported_dual_scenario); } } catch (Exception e) { e.printStackTrace(); } return dualScenarioSupported; } public class pvrStopHandler extends Handler { private Content content = null; private int nexState = -1; public void waitAndSynchronize(Content content, int nextState) { this.content = content; this.nexState = nextState; } @Override public void handleMessage(Message msg) { Log.d(TAG, "message recieved!"); switch (nexState) { case A4TVVideoView.PIP_DISPLAY_MODE: Log.d(TAG, "Next action is to play content in PIP"); playPiP(content); nexState = -1; break; case A4TVVideoView.PAP_DISPLAY_MODE: Log.d(TAG, "Next action is to play content in PAP"); playPaP(content); nexState = -1; break; case A4TVVideoView.NONE_DISPLAY_MODE: Log.d(TAG, "Next action is NONE, just set state and finish ... "); getSecondaryDisplayUnit().setPlayMode( A4TVVideoView.NONE_DISPLAY_MODE); nexState = -1; break; default: Log.d(TAG, "pvr stopped just set state and finish ... "); getSecondaryDisplayUnit().setPlayMode( A4TVVideoView.NONE_DISPLAY_MODE); nexState = -1; break; } super.handleMessage(msg); } } }