package com.kaltura.kalturaplayertoolkit; import android.annotation.SuppressLint; import android.app.Activity; import android.app.Fragment; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Point; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; import android.view.WindowManager; import android.webkit.WebView; import android.widget.RelativeLayout; import com.kaltura.playersdk.PlayerViewController; import com.kaltura.playersdk.events.KPEventListener; import com.kaltura.playersdk.events.KPlayerState; import com.kaltura.playersdk.types.KPError; import java.lang.reflect.Method; import java.util.Timer; import java.util.TimerTask; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link PlayerFragment.OnFragmentInteractionListener} interface * to handle interaction events. * Use the {@link PlayerFragment#newInstance} factory method to * create an instance of this fragment. */ public class PlayerFragment extends Fragment { // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER private static final String TAG = PlayerFragment.class.getSimpleName(); // private static final String ARG_PARAM1 = "param1"; // private static final String ARG_PARAM2 = "param2"; private PlayerViewController mPlayerView; private static final int FULL_SCREEN_FLAG = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN; // TODO: Rename and change types of parameters // private String mParam1; // private String mParam2; private OnFragmentInteractionListener mListener; private int defaultPlayerHeight; private int defaultPlayerWidth; /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @param param1 Parameter 1. * @param param2 Parameter 2. * @return A new instance of fragment PlayerFragment. */ // TODO: Rename and change types and number of parameters public static PlayerFragment newInstance(String param1, String param2) { PlayerFragment fragment = new PlayerFragment(); Bundle args = new Bundle(); // args.putString(ARG_PARAM1, param1); // args.putString(ARG_PARAM2, param2); fragment.setArguments(args); return fragment; } public PlayerFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // if (getArguments() != null) { // mParam1 = getArguments().getString(ARG_PARAM1); // mParam2 = getArguments().getString(ARG_PARAM2); // } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment final View fragmentView = inflater.inflate(R.layout.fragment_player, container, false); final WebView browser=(WebView)fragmentView.findViewById(R.id.web_view); browser.loadUrl("http://knowledge.kaltura.com/kaltura-player-sdk-android"); browser.getSettings().setLoadWithOverviewMode(true); browser.getSettings().setUseWideViewPort(true); mPlayerView = (PlayerViewController) fragmentView.findViewById(R.id.player); final ViewTreeObserver vto = mPlayerView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mPlayerView.getViewTreeObserver().removeGlobalOnLayoutListener(this); defaultPlayerWidth = mPlayerView.getMeasuredWidth(); defaultPlayerHeight = mPlayerView.getMeasuredHeight(); showPlayerView(); } }); mPlayerView.loadPlayerIntoActivity(getActivity()); mPlayerView.addEventListener(new KPEventListener() { @Override public void onKPlayerStateChanged(PlayerViewController playerViewController, KPlayerState state) { switch (state) { case READY: mPlayerView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { @Override public void onSystemUiVisibilityChange(int visibility) { Log.d(TAG, "onSystemVisibility change"); if (visibility == FULL_SCREEN_FLAG) { Point size = getRealScreenSize(); mPlayerView.setPlayerViewDimensions(size.x, size.y); } else { Point size = getScreenWithoutNavigationSize();//getActivity().getWindowManager().getDefaultDisplay().getSize(size) mPlayerView.setPlayerViewDimensions(size.x, size.y); } } }); break; case PLAYING: if (getResources().getConfiguration().orientation != Configuration.ORIENTATION_PORTRAIT) { setFullScreen(); } break; case PAUSED: getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); break; } } @Override public void onKPlayerError(PlayerViewController playerViewController, KPError error) { } @Override public void onKPlayerPlayheadUpdate(PlayerViewController playerViewController, float currentTime) { } @Override public void onKPlayerFullScreenToggeled(PlayerViewController playerViewController, boolean isFullscrenn) { setFullScreen(); } }); return fragmentView; } // TODO: Rename method, update argument and hook method into UI event public void onButtonPressed(Uri uri) { if (mListener != null) { mListener.onFragmentInteraction(uri); } } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (OnFragmentInteractionListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p/> * See the Android Training lesson <a href= * "http://developer.android.com/training/basics/fragments/communicating.html" * >Communicating with Other Fragments</a> for more information. */ public interface OnFragmentInteractionListener { // TODO: Update argument type and name public void onFragmentInteraction(Uri uri); } private void setPlayerFullScreen(){ View decorView = getActivity().getWindow().getDecorView(); //navigation view int uiOptions = FULL_SCREEN_FLAG; decorView.setSystemUiVisibility(uiOptions); Point size = getRealScreenSize(); mPlayerView.setPlayerViewDimensions(size.x, size.y); } private void setFullScreen(){ // getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { if(mPlayerView.getHeight() > defaultPlayerHeight){ Point size = getDefaultPlayerScreenSize(); mPlayerView.setPlayerViewDimensions(size.x, size.y); }else{ setPlayerFullScreen(); } } else { setPlayerFullScreen(); } } private Point getDefaultPlayerScreenSize() { int height = defaultPlayerHeight; int width = defaultPlayerWidth; return new Point(width, height); } private Point getScreenWithoutNavigationSize() { Display display = getActivity().getWindowManager().getDefaultDisplay(); DisplayMetrics realMetrics = new DisplayMetrics(); display.getMetrics(realMetrics); int width = realMetrics.widthPixels; int height = realMetrics.heightPixels; return new Point(width, height); } @SuppressLint("NewApi") private Point getRealScreenSize(){ Display display = getActivity().getWindowManager().getDefaultDisplay(); int realWidth = 0; int realHeight = 0; if (Build.VERSION.SDK_INT >= 17){ //new pleasant way to get real metrics DisplayMetrics realMetrics = new DisplayMetrics(); display.getRealMetrics(realMetrics); realWidth = realMetrics.widthPixels; realHeight = realMetrics.heightPixels; } else { try { Method mGetRawH = Display.class.getMethod("getRawHeight"); Method mGetRawW = Display.class.getMethod("getRawWidth"); realWidth = (Integer) mGetRawW.invoke(display); realHeight = (Integer) mGetRawH.invoke(display); } catch (Exception e) { realWidth = display.getWidth(); realHeight = display.getHeight(); Log.e("Display Info", "Couldn't use reflection to get the real display metrics."); } } return new Point(realWidth,realHeight); } private void showPlayerView() { getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); mPlayerView.setVisibility(RelativeLayout.VISIBLE); // Point size = new Point(); // getActivity().getWindowManager().getDefaultDisplay().getSize(size); mPlayerView.setPlayerViewDimensions( defaultPlayerWidth, defaultPlayerHeight, 0, 0 ); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if ( mPlayerView.getVisibility() == RelativeLayout.VISIBLE ) { Timer swapTimer = new Timer(); swapTimer.schedule(new TimerTask() { @Override public void run() { getActivity().runOnUiThread(new Runnable() { public void run() { Point size; if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { size = getDefaultPlayerScreenSize(); } else { size = new Point(); getActivity().getWindowManager().getDefaultDisplay().getSize(size); View decorView = getActivity().getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN; decorView.setSystemUiVisibility(uiOptions); } mPlayerView.setPlayerViewDimensions(size.x, size.y, 0, 0); } }); } }, 100 ); } } @Override public void onPause() { super.onPause(); if ( mPlayerView != null ) { mPlayerView.releaseAndSavePosition(); } } @Override public void onResume() { super.onResume(); if ( mPlayerView != null ) { mPlayerView.resumePlayer(); } } }