package tv.emby.embyatv.ui; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.Color; import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.TextView; import java.util.Date; import mediabrowser.apiinteraction.EmptyResponse; import mediabrowser.apiinteraction.Response; import mediabrowser.model.dto.BaseItemDto; import mediabrowser.model.livetv.SeriesTimerInfoDto; import tv.emby.embyatv.R; import tv.emby.embyatv.TvApp; import tv.emby.embyatv.base.BaseActivity; import tv.emby.embyatv.livetv.LiveTvGuideActivity; import tv.emby.embyatv.livetv.TvManager; import tv.emby.embyatv.util.InfoLayoutHelper; import tv.emby.embyatv.util.Utils; /** * Created by Eric on 9/8/2015. */ public class LiveProgramDetailPopup { final int MOVIE_HEIGHT = Utils.convertDpToPixel(TvApp.getApplication(), 540); final int NORMAL_HEIGHT = Utils.convertDpToPixel(TvApp.getApplication(), 400); PopupWindow mPopup; BaseItemDto mProgram; ProgramGridCell mSelectedProgramView; BaseActivity mActivity; TextView mDTitle; TextView mDSummary; TextView mDRecordInfo; LinearLayout mDTimeline; LinearLayout mDInfoRow; LinearLayout mDButtonRow; LinearLayout mDSimilarRow; Button mFirstButton; EmptyResponse mTuneAction; View mAnchor; int mPosLeft; int mPosTop; public LiveProgramDetailPopup(BaseActivity activity, int width, EmptyResponse tuneAction) { mActivity = activity; mTuneAction = tuneAction; LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View layout = inflater.inflate(R.layout.program_detail_popup, null); Typeface roboto = TvApp.getApplication().getDefaultFont(); mPopup = new PopupWindow(layout, width, NORMAL_HEIGHT); mPopup.setFocusable(true); mPopup.setOutsideTouchable(true); mPopup.setBackgroundDrawable(new BitmapDrawable()); // necessary for popup to dismiss mPopup.setAnimationStyle(R.style.PopupSlideInTop); mDTitle = (TextView)layout.findViewById(R.id.title); mDTitle.setTypeface(roboto); mDSummary = (TextView)layout.findViewById(R.id.summary); mDSummary.setTypeface(roboto); mDRecordInfo = (TextView) layout.findViewById(R.id.recordLine); mDTimeline = (LinearLayout) layout.findViewById(R.id.timeline); mDButtonRow = (LinearLayout) layout.findViewById(R.id.buttonRow); mDInfoRow = (LinearLayout) layout.findViewById(R.id.infoRow); mDSimilarRow = (LinearLayout) layout.findViewById(R.id.similarRow); } public boolean isShowing() { return (mPopup != null && mPopup.isShowing()); } public void setContent(final BaseItemDto program, final ProgramGridCell selectedGridView) { mProgram = program; mSelectedProgramView = selectedGridView; mDTitle.setText(program.getName()); mDButtonRow.removeAllViews(); if (program.getId() == null) { //empty item, just offer tune button mFirstButton = createTuneButton(); mDInfoRow.removeAllViews(); mDTimeline.removeAllViews(); mDSummary.setText(""); return; } mDSummary.setText(program.getOverview()); if (mDSummary.getLineCount() < 2) { mDSummary.setGravity(Gravity.CENTER); } else { mDSummary.setGravity(Gravity.LEFT); } //TvApp.getApplication().getLogger().Debug("Text height: "+mDSummary.getHeight() + " (120 = "+Utils.convertDpToPixel(mActivity, 120)+")"); // build timeline info TvManager.setTimelineRow(mActivity, mDTimeline, program); //info row InfoLayoutHelper.addInfoRow(mActivity, program, mDInfoRow, false, false); //buttons mFirstButton = null; Date now = new Date(); Date local = Utils.convertToLocalDate(program.getStartDate()); if (Utils.convertToLocalDate(program.getEndDate()).getTime() > now.getTime()) { if (local.getTime() <= now.getTime()) { // program in progress - tune first button mFirstButton = createTuneButton(); } if (TvApp.getApplication().getCurrentUser().getPolicy().getEnableLiveTvManagement()) { if (program.getTimerId() != null) { // cancel button Button cancel = new Button(mActivity); cancel.setText(mActivity.getResources().getString(R.string.lbl_cancel_recording)); cancel.setTextColor(Color.WHITE); cancel.setBackground(mActivity.getResources().getDrawable(R.drawable.emby_button)); cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TvApp.getApplication().getApiClient().CancelLiveTvTimerAsync(program.getTimerId(), new EmptyResponse() { @Override public void onResponse() { selectedGridView.setRecTimer(null); dismiss(); Utils.showToast(mActivity, R.string.msg_recording_cancelled); } @Override public void onError(Exception ex) { Utils.showToast(mActivity, R.string.msg_unable_to_cancel); } }); } }); mDButtonRow.addView(cancel); if (mFirstButton == null) mFirstButton = cancel; // recording info mDRecordInfo.setText(local.getTime() <= now.getTime() ? mActivity.getResources().getString(R.string.msg_recording_now) : mActivity.getResources().getString(R.string.msg_will_record)); } else { // record button Button rec = new Button(mActivity); rec.setText(mActivity.getResources().getString(R.string.lbl_record)); rec.setTextColor(Color.WHITE); rec.setBackground(mActivity.getResources().getDrawable(R.drawable.emby_button)); rec.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showRecordingOptions(false); } }); mDButtonRow.addView(rec); if (mFirstButton == null) mFirstButton = rec; mDRecordInfo.setText(""); } if (Utils.isTrue(program.getIsSeries())) { if (program.getSeriesTimerId() != null) { // cancel series button Button cancel = new Button(mActivity); cancel.setText(mActivity.getResources().getString(R.string.lbl_cancel_series)); cancel.setTextColor(Color.WHITE); cancel.setBackground(mActivity.getResources().getDrawable(R.drawable.emby_button)); cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new AlertDialog.Builder(mActivity) .setTitle(mActivity.getResources().getString(R.string.lbl_cancel_series)) .setMessage(mActivity.getResources().getString(R.string.msg_cancel_entire_series)) .setNegativeButton(R.string.lbl_no, null) .setPositiveButton(R.string.lbl_yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { TvApp.getApplication().getApiClient().CancelLiveTvSeriesTimerAsync(program.getSeriesTimerId(), new EmptyResponse() { @Override public void onResponse() { selectedGridView.setRecSeriesTimer(null); dismiss(); Utils.showToast(mActivity, R.string.msg_recording_cancelled); } @Override public void onError(Exception ex) { Utils.showToast(mActivity, R.string.msg_unable_to_cancel); } }); } }).show(); } }); mDButtonRow.addView(cancel); }else { // record series button Button rec = new Button(mActivity); rec.setText(mActivity.getResources().getString(R.string.lbl_record_series)); rec.setTextColor(Color.WHITE); rec.setBackground(mActivity.getResources().getDrawable(R.drawable.emby_button)); rec.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showRecordingOptions(true); } }); mDButtonRow.addView(rec); } } } if (local.getTime() > now.getTime()) { // add tune to button for programs that haven't started yet createTuneButton(); } } else { // program has already ended mDRecordInfo.setText(mActivity.getResources().getString(R.string.lbl_program_ended)); mFirstButton = createTuneButton(); } // if (program.getIsMovie()) { // mDSimilarRow.setVisibility(View.VISIBLE); // mPopup.setHeight(MOVIE_HEIGHT); // } else { mDSimilarRow.setVisibility(View.GONE); // mPopup.setHeight(NORMAL_HEIGHT); // // } } public Button createTuneButton() { Button tune = addButton(mDButtonRow, R.string.lbl_tune_to_channel); tune.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mTuneAction != null) mTuneAction.onResponse(); mPopup.dismiss(); } }); return tune; } private Button addButton(LinearLayout layout, int stringResource) { Button btn = new Button(mActivity); btn.setText(mActivity.getResources().getString(stringResource)); btn.setTextColor(Color.WHITE); btn.setBackground(mActivity.getResources().getDrawable(R.drawable.emby_button)); layout.addView(btn); return btn; } public void show(View anchor, int x, int y) { mAnchor = anchor; mPosLeft = x; mPosTop = y; mPopup.showAtLocation(anchor, Gravity.NO_GRAVITY, x, y); if (mFirstButton != null) mFirstButton.requestFocus(); } public void dismiss() { if (mRecordPopup != null && mRecordPopup.isShowing()) mRecordPopup.dismiss(); if (mPopup != null && mPopup.isShowing()) mPopup.dismiss(); } private RecordPopup mRecordPopup; public void showRecordingOptions(final boolean recordSeries) { if (mRecordPopup == null) mRecordPopup = new RecordPopup(mActivity, mAnchor, mPosLeft, mPosTop, mPopup.getWidth()); TvApp.getApplication().getApiClient().GetDefaultLiveTvTimerInfo(mProgram.getId(), new Response<SeriesTimerInfoDto>() { @Override public void onResponse(SeriesTimerInfoDto response) { mRecordPopup.setContent(mProgram, response, mSelectedProgramView, recordSeries); mRecordPopup.show(); } }); } }