package com.felkertech.cumulustv.tv.fragments;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.media.tv.TvContract;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.support.v17.leanback.app.BackgroundManager;
import android.support.v17.leanback.app.DetailsFragment;
import android.support.v17.leanback.widget.Action;
import android.support.v17.leanback.widget.ArrayObjectAdapter;
import android.support.v17.leanback.widget.ClassPresenterSelector;
import android.support.v17.leanback.widget.DetailsOverviewRow;
import android.support.v17.leanback.widget.DetailsOverviewRowPresenter;
import android.support.v17.leanback.widget.ListRow;
import android.support.v17.leanback.widget.ListRowPresenter;
import android.support.v17.leanback.widget.OnActionClickedListener;
import android.util.DisplayMetrics;
import android.util.Log;
import com.bumptech.glide.Glide;
import com.felkertech.cumulustv.utils.ActivityUtils;
import com.felkertech.n.cumulustv.R;
import com.felkertech.cumulustv.activities.MainActivity;
import com.felkertech.cumulustv.model.ChannelDatabase;
import com.felkertech.cumulustv.model.JsonChannel;
import com.felkertech.cumulustv.tv.Utils;
import com.felkertech.cumulustv.tv.activities.DetailsActivity;
import com.felkertech.cumulustv.tv.activities.LeanbackActivity;
import com.felkertech.cumulustv.tv.presenters.DetailsDescriptionPresenter;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.drive.Drive;
import org.json.JSONException;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
/*
* LeanbackDetailsFragment extends DetailsFragment, a Wrapper fragment for leanback details screens.
* It shows a detailed view of video and its meta plus related videos.
*/
public class VideoDetailsFragment extends DetailsFragment
implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
private static final String TAG = VideoDetailsFragment.class.getSimpleName();
private static final boolean DEBUG = true;
public static final String EXTRA_JSON_CHANNEL = "json";
private static final int ACTION_ADD = 3;
private static final int ACTION_EDIT = 5;
private static final int ACTION_WATCH = 6;
private static final int DETAIL_THUMB_WIDTH = 274;
private static final int DETAIL_THUMB_HEIGHT = 274;
private static final int NUM_COLS = 10;
private JsonChannel jsonChannel;
private ArrayObjectAdapter mAdapter;
private ClassPresenterSelector mPresenterSelector;
private BackgroundManager mBackgroundManager;
private Drawable mDefaultBackground;
private DisplayMetrics mMetrics;
private GoogleApiClient gapi;
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate DetailsFragment");
super.onCreate(savedInstanceState);
prepareBackgroundManager();
try {
jsonChannel = new JsonChannel.Builder(getActivity().getIntent()
.getStringExtra(EXTRA_JSON_CHANNEL))
.build();
} catch (JSONException e) {
throw new IllegalArgumentException(e.getMessage());
}
if (jsonChannel != null) {
setupAdapter();
setupDetailsOverviewRow();
setupDetailsOverviewRowPresenter();
setupMovieListRowPresenter();
updateBackground();
} else {
Intent intent = new Intent(getActivity(), MainActivity.class);
startActivity(intent);
}
gapi = new GoogleApiClient.Builder(getActivity())
.addApi(Drive.API)
.addScope(Drive.SCOPE_FILE)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
gapi.connect();
}
@Override
public void onStop() {
super.onStop();
}
private void prepareBackgroundManager() {
mBackgroundManager = BackgroundManager.getInstance(getActivity());
mBackgroundManager.attach(getActivity().getWindow());
mDefaultBackground = getResources().getDrawable(R.drawable.c_background5);
mMetrics = new DisplayMetrics();
getActivity().getWindowManager().getDefaultDisplay().getMetrics(mMetrics);
}
protected void updateBackground() {
mBackgroundManager.setDrawable(getResources().getDrawable(R.drawable.c_background5));
}
@Override
public void onResume() {
super.onResume();
updateBackground();
}
private void setupAdapter() {
mPresenterSelector = new ClassPresenterSelector();
mAdapter = new ArrayObjectAdapter(mPresenterSelector);
setAdapter(mAdapter);
}
private void setupDetailsOverviewRow() {
final DetailsOverviewRow row = new DetailsOverviewRow(jsonChannel);
row.setImageDrawable(getResources().getDrawable(R.drawable.c_background5));
int width = Utils.convertDpToPixel(getActivity()
.getApplicationContext(), DETAIL_THUMB_WIDTH);
int height = Utils.convertDpToPixel(getActivity()
.getApplicationContext(), DETAIL_THUMB_HEIGHT);
new Thread(new Runnable() {
@Override
public void run() {
try {
final Bitmap bitmap = Glide.with(getActivity())
.load(ChannelDatabase.getNonNullChannelLogo(jsonChannel))
.asBitmap()
.fitCenter()
.error(R.drawable.c_background5)
.into(DETAIL_THUMB_WIDTH, DETAIL_THUMB_HEIGHT)
.get();
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
row.setImageBitmap(getActivity(), bitmap);
mAdapter.notifyArrayItemRangeChanged(0, mAdapter.size());
}
});
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}).start();
ArrayObjectAdapter actions = new ArrayObjectAdapter();
// Add another action IF it isn't a channel you already have:
ChannelDatabase cdn = ChannelDatabase.getInstance(getActivity());
if(cdn.findChannelByMediaUrl(jsonChannel.getMediaUrl()) == null) {
actions.add(new Action(ACTION_ADD, getString(R.string.add_channel_txt)));
} else {
actions.add(new Action(ACTION_EDIT, getString(R.string.edit_channel)));
}
actions.add(new Action(ACTION_WATCH, getString(R.string.play)));
row.setActionsAdapter(actions);
mAdapter.add(row);
}
private void setupDetailsOverviewRowPresenter() {
// Set detail background and style.
DetailsOverviewRowPresenter detailsPresenter =
new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter());
detailsPresenter.setBackgroundColor(getResources().getColor(R.color.selected_background));
detailsPresenter.setStyleLarge(true);
// Hook up transition element.
detailsPresenter.setSharedElementEnterTransition(getActivity(),
DetailsActivity.SHARED_ELEMENT_NAME);
detailsPresenter.setOnActionClickedListener(new OnActionClickedListener() {
@Override
public void onActionClicked(Action action) {
if(action.getId() == ACTION_EDIT) {
ActivityUtils.editChannel(getActivity(), jsonChannel.getMediaUrl());
} else if(action.getId() == ACTION_WATCH) {
Log.d(TAG, ChannelDatabase.getInstance(getActivity()).getHashMap().toString());
if (ChannelDatabase.getInstance(getActivity()).getHashMap()
.containsKey(jsonChannel.getMediaUrl())) {
// Open in Live Channels
Uri liveChannelsUri =
TvContract.buildChannelUri(
ChannelDatabase.getInstance(
getActivity()).getHashMap()
.get(jsonChannel.getMediaUrl()));
getActivity().startActivity(
new Intent(Intent.ACTION_VIEW, liveChannelsUri));
} else {
ActivityUtils.openStream(getActivity(), jsonChannel.getMediaUrl());
}
} else if(action.getId() == ACTION_ADD) {
Log.d(TAG, "Adding " + jsonChannel.toString());
ActivityUtils
.addChannel(getActivity(), gapi, jsonChannel);
getActivity().setResult(LeanbackActivity.RESULT_CODE_REFRESH_UI);
getActivity().finish();
}
}
});
mPresenterSelector.addClassPresenter(DetailsOverviewRow.class, detailsPresenter);
}
private void setupMovieListRowPresenter() {
mPresenterSelector.addClassPresenter(ListRow.class, new ListRowPresenter());
}
@Override
public void onConnected(Bundle bundle) {
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
}
}