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.WindowManager;
import android.widget.RelativeLayout;
import com.kaltura.playersdk.KPPlayerConfig;
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;
/**
* Created by itayi on 2/12/15.
*/
public class FullscreenFragment extends Fragment{
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String TAG = FullscreenFragment.class.getSimpleName();
private View mFragmentView = null;
private CastDetectedDevicesDialog mDevicesDialog;
// 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;
/**
* 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 FullscreenFragment.
*/
// TODO: Rename and change types and number of parameters
public static FullscreenFragment newInstance(String param1, String param2) {
FullscreenFragment fragment = new FullscreenFragment();
Bundle args = new Bundle();
// args.putString(ARG_PARAM1, param1);
// args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
public FullscreenFragment() {
// 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
if(mFragmentView == null) {
mFragmentView = inflater.inflate(R.layout.fragment_fullscreen, container, false);
}
mPlayerView = (PlayerViewController) mFragmentView.findViewById(R.id.player);
mPlayerView.loadPlayerIntoActivity(getActivity());
// mPlayerView.getKCastRouterManager().setCastRouterManagerListener(new KCastRouterManagerListener() {
// @Override
// public void onCastButtonClicked() {
// getDevicesDialog().show();
// }
//
// @Override
// public void onApplicationStatusChanged(boolean isConnected) {
// getDevicesDialog().deviceConnectionStateDidChange(isConnected);
// }
//
// @Override
// public void shouldPresentCastIcon(boolean shouldPresentOrDismiss) {
//
// }
//
// @Override
// public void onAddedCastDevice(KCastDevice info) {
// getDevicesDialog().addCastDevice(info);
// }
//
// @Override
// public void onRemovedCastDevice(KCastDevice info) {
// getDevicesDialog().removeCastDevice(info);
// }
// });
//
// mPlayerView.getKCastRouterManager().enableKalturaCastButton(true);
mPlayerView.addEventListener(new KPEventListener() {
@Override
public void onKPlayerStateChanged(PlayerViewController playerViewController, KPlayerState state) {
switch (state) {
case READY:
setFullScreen();
getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
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 PAUSED:
getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
break;
}
}
@Override
public void onKPlayerPlayheadUpdate(PlayerViewController playerViewController, float currentTime) {
}
@Override
public void onKPlayerFullScreenToggeled(PlayerViewController playerViewController, boolean isFullscrenn) {
setFullScreen();
}
@Override
public void onKPlayerError(PlayerViewController playerViewController, KPError error) {
}
});
showPlayerView();
Bundle bundle = getArguments();
KPPlayerConfig config = null;
if (bundle != null && (config = (KPPlayerConfig)bundle.getSerializable("config")) != null){
mPlayerView.initWithConfiguration(config);
}
else{
Log.e("ConfigNotLoaded", "Couldn't read config data check if it was initialized.");
return null;
}
return mFragmentView;
}
// 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 CastDetectedDevicesDialog getDevicesDialog() {
// if (mDevicesDialog == null) {
// mDevicesDialog = new CastDetectedDevicesDialog(getActivity(), new CastDetectedDevicesDialog.CastDetectedDevicesDialogListener() {
// @Override
// public void disconnect() {
// mPlayerView.getKCastRouterManager().disconnect();
// }
//
// @Override
// public void routeSelected(String castDeviceId) {
// mPlayerView.getKCastRouterManager().connectDevice(castDeviceId);
// }
// });
// }
// return mDevicesDialog;
// }
private void setFullScreen (){
View decorView = getActivity().getWindow().getDecorView(); //navigation view
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
// Point size = getRealScreenSize();
// mPlayerView.setPlayerViewDimensions(size.x, size.y);
}
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( size.x, size.y, 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 = new Point();
getActivity().getWindowManager().getDefaultDisplay().getSize(size);
mPlayerView.setPlayerViewDimensions(size.x, size.y, 0, 0);
View decorView = getActivity().getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
}
});
}
}, 100 );
}
}
@Override
public void onPause() {
super.onPause();
if ( mPlayerView != null ) {
mPlayerView.releaseAndSavePosition();
}
}
@Override
public void onResume() {
super.onResume();
if ( mPlayerView != null ) {
mPlayerView.resumePlayer();
}
}
}