Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

close fullscreen of Youtube Player on back button inside fragment

I am using Master/Detail layout in a tablet, on the left few buttons to open several fragments, one of the fragments contains youtube player.

The Problem,

When the youtube player is full screen, and i press back button, The activity onBackPressed is called, and the whole activity is closed.

What i have tried,

1- Added on KeyListener for parent fragment (which contains the Youtube Fragment) and handle when click on back button, but this listener is called only if the player is not fullscreen, otherwise it is not called,

rootView.setFocusableInTouchMode(true);
        rootView.requestFocus();
        rootView.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
                    try {
                        // Close full screen
                        return true;
                    } catch (Exception e) {
                        AHHExceptionHandler.handleException(e);
                    }
                }
                return false;
            }
        });

2- Added onKeyListener to youtubeFragment View to check if it is full screen then close the full screen mode

youTubeFragment.getView().setFocusableInTouchMode(true);
youTubeFragment.getView().requestFocus();
    youTubeFragment.getView().setOnKeyListener(new View.OnKeyListener() {
                                                @Override
                                                public boolean onKey(View v, int keyCode, KeyEvent event) {
                                                    if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
                                                        try {
                                                            youTubePlayer.setFullscreen(false);
                                                            return true;
                                                        } catch (Exception e) {
                                                            AHHExceptionHandler.handleException(e);
                                                        }
                                                    }
                                                    return false;
                                                }
                                            });

And this is also not called in all cases.

I need to handle the hardware back button while the youtube player is in fullscreen, the fullscreen mode is closed and the application is in its previous state.

Thanks.

Edit 1: - I want to handle this inside the fragment, instead of handling it in the parent Activity, I already handling it inside the parent activity, but I don't like this solution.

like image 926
Omar HossamEldin Avatar asked Feb 08 '16 12:02

Omar HossamEldin


2 Answers

Just to add to Andre's reply.

In your parent Activity add:

public YouTubePlayer youTubePlayer;
public boolean isYouTubePlayerFullScreen;

In your fragment add:

MainActivity mainActivity = (MainActivity) getActivity();

Then, on YouTubePlayerFragment initialization:

    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean b) {
        mainActivity.youTubePlayer = player;
        player.loadVideo(videoId);

        player.setOnFullscreenListener(new YouTubePlayer.OnFullscreenListener() {
            @Override
            public void onFullscreen(boolean b) {
                mainActivity.isYouTubePlayerFullScreen = b;
            }
        });

    }

Now your Activity has access to YouTubePlayer and information if player is full screen or not.

Next, inside your Activity, override onBackPressed like this:

@Override
public void onBackPressed() {
    if (youTubePlayer != null && isYouTubePlayerFullScreen){
            youTubePlayer.setFullscreen(false);
    } else {
        super.onBackPressed();
    }
}
like image 145
Valeriya Avatar answered Oct 22 '22 11:10

Valeriya


You can override onBackPressed() in your activity and in case your player is in fullscreen, you can handle it there as follows:

@Override
public void onBackPressed() {

    if (youtubePlayer != null && isFullscreen) {
        // if fullscreen, set fullscreen false
        youtubePlayer.setFullscreen(false);

    } else {
        // if NOT fullscreen, perform default call on back press
        super.onBackPressed();
    }
}

P.S. In above code fragment, isFullscreen is instance variable of our activity and is synced with youtubePlayer state from within OnFullscreenListener set on youtubePlayer.setOnFullScreenListener().

Hope that makes sense :)

like image 28
Andre Classen Avatar answered Oct 22 '22 11:10

Andre Classen