package com.ov3rk1ll.kinocast.ui;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.ColorStateList;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.CollapsingToolbarLayout;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.ActionMenuView;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.GlideBitmapDrawable;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import com.flurry.android.FlurryAgent;
import com.flurry.android.ads.FlurryAdBanner;
import com.flurry.android.ads.FlurryAdBannerListener;
import com.flurry.android.ads.FlurryAdErrorType;
import com.google.android.gms.cast.MediaInfo;
import com.google.android.gms.cast.MediaMetadata;
import com.google.android.gms.common.images.WebImage;
import com.google.android.libraries.cast.companionlibrary.cast.BaseCastManager;
import com.google.android.libraries.cast.companionlibrary.cast.VideoCastManager;
import com.ov3rk1ll.kinocast.BuildConfig;
import com.ov3rk1ll.kinocast.R;
import com.ov3rk1ll.kinocast.api.Parser;
import com.ov3rk1ll.kinocast.api.mirror.Host;
import com.ov3rk1ll.kinocast.data.Season;
import com.ov3rk1ll.kinocast.data.ViewModel;
import com.ov3rk1ll.kinocast.ui.helper.PaletteManager;
import com.ov3rk1ll.kinocast.ui.util.glide.OkHttpViewModelStreamFetcher;
import com.ov3rk1ll.kinocast.ui.util.glide.ViewModelGlideRequest;
import com.ov3rk1ll.kinocast.utils.BookmarkManager;
import com.ov3rk1ll.kinocast.utils.TheMovieDb;
import com.ov3rk1ll.kinocast.utils.Utils;
import com.ov3rk1ll.kinocast.utils.WeightedHostComparator;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SuppressWarnings("ConstantConditions")
public class DetailActivity extends AppCompatActivity implements ActionMenuView.OnMenuItemClickListener {
public static final String ARG_ITEM = "param_item";
private ViewModel item;
private RelativeLayout mAdView;
private VideoCastManager mVideoCastManager;
@SuppressWarnings("FieldCanBeLocal")
private boolean SHOW_ADS = true;
private BookmarkManager bookmarkManager;
private CollapsingToolbarLayout collapsingToolbarLayout;
private int mRestoreSeasonIndex = -1;
private int mRestoreEpisodeIndex = -1;
@Override
public void onBackPressed() {
super.onBackPressed();
supportFinishAfterTransition();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (BuildConfig.GMS_CHECK) BaseCastManager.checkGooglePlayServices(this);
mVideoCastManager = Utils.initializeCastManager(this);
setContentView(R.layout.activity_detail);
mVideoCastManager.reconnectSessionIfPossible();
// actionBar.setDisplayHomeAsUpEnabled(true);
//((ActionMenuView) findViewById(R.id.bar_split)).setOnMenuItemClickListener(this);
bookmarkManager = new BookmarkManager(getApplication());
bookmarkManager.restore();
item = (ViewModel) getIntent().getSerializableExtra(ARG_ITEM);
if (item == null) {
startActivity(new Intent(this, MainActivity.class));
finish();
return;
}
initToolbar();
initInstances();
attemptColor(null);
findViewById(R.id.button_donate).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.paypal_donate)));
startActivity(intent);
}
});
FlurryAgent.onStartSession(this);
mAdView = (RelativeLayout)findViewById(R.id.adView);
if (SHOW_ADS) {
findViewById(R.id.donateView).setVisibility(View.GONE);
String mAdSpaceName = "Detail Banner";
FlurryAdBanner mFlurryAdBanner = new FlurryAdBanner(this, mAdView, mAdSpaceName);
mFlurryAdBanner.setListener(new FlurryAdBannerListener() {
@Override
public void onFetched(FlurryAdBanner flurryAdBanner) {
}
@Override
public void onRendered(FlurryAdBanner flurryAdBanner) {
}
@Override
public void onShowFullscreen(FlurryAdBanner flurryAdBanner) {
}
@Override
public void onCloseFullscreen(FlurryAdBanner flurryAdBanner) {
}
@Override
public void onAppExit(FlurryAdBanner flurryAdBanner) {
}
@Override
public void onClicked(FlurryAdBanner flurryAdBanner) {
}
@Override
public void onVideoCompleted(FlurryAdBanner flurryAdBanner) {
}
@Override
public void onError(FlurryAdBanner flurryAdBanner, FlurryAdErrorType flurryAdErrorType, int i) {
Log.e("FlurryAdBanner", "onError: " + flurryAdErrorType);
mAdView.setVisibility(View.GONE);
findViewById(R.id.donateView).setVisibility(View.VISIBLE);
}
});
mFlurryAdBanner.fetchAndDisplayAd();
//mAdView.setInventoryHash(getString(R.string.mobfox_hash));
//mAdView.load();
} else {
mAdView.setVisibility(View.GONE);
findViewById(R.id.donateView).setVisibility(View.GONE);
findViewById(R.id.hr2).setVisibility(View.GONE);
}
int screenWidthPx = getResources().getDisplayMetrics().widthPixels;
((TextView) findViewById(R.id.detail)).setText(item.getSummary());
final ImageView headerImage = (ImageView) findViewById(R.id.image_header);
findViewById(R.id.progressBar).setVisibility(View.VISIBLE);
findViewById(R.id.progressBar).invalidate();
Glide.with(this)
.load(new ViewModelGlideRequest(item, screenWidthPx, "backdrop"))
.placeholder(R.drawable.ic_loading_placeholder)
.listener(new RequestListener<ViewModelGlideRequest, GlideDrawable>() {
@Override
public boolean onException(Exception e, ViewModelGlideRequest model, Target<GlideDrawable> target, boolean isFirstResource) {
e.printStackTrace();
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, ViewModelGlideRequest model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
findViewById(R.id.progressBar).clearAnimation();
findViewById(R.id.progressBar).setVisibility(View.GONE);
findViewById(R.id.progressBar).invalidate();
findViewById(R.id.top_content).invalidate();
attemptColor(((GlideBitmapDrawable)resource.getCurrent()).getBitmap());
return false;
}
})
.into(headerImage);
headerImage.setVisibility(View.VISIBLE);
((ImageView) findViewById(R.id.language)).setImageResource(item.getLanguageResId());
((Spinner) findViewById(R.id.spinnerSeason)).setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
final Spinner spinnerEpisode = (Spinner) findViewById(R.id.spinnerEpisode);
spinnerEpisode.setAdapter(
new ArrayAdapter<>(DetailActivity.this, android.R.layout.simple_list_item_1, item.getSeasons()[position].episodes));
if (mRestoreEpisodeIndex != -1) {
spinnerEpisode.setSelection(mRestoreEpisodeIndex);
mRestoreEpisodeIndex = -1;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
((Spinner) findViewById(R.id.spinnerEpisode)).setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
(new QueryHosterTask()).execute((Void) null);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
findViewById(R.id.buttonPlay).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!com.ov3rk1ll.kinocast.utils.Utils.isWifiConnected(DetailActivity.this)) {
new AlertDialog.Builder(DetailActivity.this)
.setMessage(getString(R.string.player_warn_no_wifi))
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
(new QueryPlayTask(DetailActivity.this)).execute((Void) null);
}
})
.setNegativeButton(android.R.string.cancel, null)
.show();
} else {
(new QueryPlayTask(DetailActivity.this)).execute((Void) null);
}
}
});
(new QueryDetailTask()).execute((Void) null);
}
private void initToolbar() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
private void initInstances() {
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//getSupportActionBar().setTitle(item.getTitle());
collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsingToolbarLayout);
collapsingToolbarLayout.setTitle(item.getTitle());
}
boolean hasColors = false;
private void attemptColor(Bitmap bitmap) {
if (hasColors) return;
PaletteManager.getInstance().getPalette(item.getSlug(), bitmap, new PaletteManager.Callback() {
@Override
public void onPaletteReady(Palette palette) {
if (palette == null) return;
Palette.Swatch swatch = palette.getDarkVibrantSwatch();
if (swatch != null) {
collapsingToolbarLayout.setContentScrimColor(swatch.getRgb());
findViewById(R.id.hr1).setBackgroundColor(swatch.getRgb());
findViewById(R.id.hr2).setBackgroundColor(swatch.getRgb());
//collapsingToolbarLayout.setCollapsedTitleTextColor(swatch.getTitleTextColor());
//collapsingToolbarLayout.setExpandedTitleColor(swatch.getTitleTextColor());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Log.i("progressBar", "set color to " + swatch.getRgb());
((ProgressBar) findViewById(R.id.progressBar)).setIndeterminateTintList(ColorStateList.valueOf(swatch.getRgb()));
float hsv[] = new float[3];
Color.colorToHSV(swatch.getRgb(), hsv);
hsv[2] = 0.2f;
getWindow().setStatusBarColor(Color.HSVToColor(hsv));
Log.i("progressBar", "Visibility in color = " + findViewById(R.id.progressBar).getVisibility());
}
hasColors = true;
}
}
});
}
@Override
protected void onResume() {
super.onResume();
mVideoCastManager.incrementUiCounter();
//TODO Check if we are playing the current item
//if(mAdView != null) mAdView.onResume();
//if(mVideoCastManager.getRemoteMediaInformation())
}
@Override
protected void onPause() {
super.onPause();
mVideoCastManager.decrementUiCounter();
//Update Bookmark to keep series info
if (item.getType() == ViewModel.Type.SERIES) {
BookmarkManager.Bookmark b = new BookmarkManager.Bookmark(Parser.getInstance().getParserId(), Parser.getInstance().getPageLink(item));
b.setSeason(((Spinner) findViewById(R.id.spinnerSeason)).getSelectedItemPosition());
b.setEpisode(((Spinner) findViewById(R.id.spinnerEpisode)).getSelectedItemPosition());
int idx = bookmarkManager.indexOf(b);
if (idx == -1) {
bookmarkManager.add(b);
} else {
b.setInternal(bookmarkManager.get(idx).isInternal());
bookmarkManager.set(idx, b);
}
}
//if(mAdView != null) mAdView.onPause();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
//getMenuInflater().inflate(R.menu.detail, menu);
//menu = ((ActionMenuView) findViewById(R.id.bar_split)).getMenu();
menu.clear();
getMenuInflater().inflate(R.menu.detail, menu);
mVideoCastManager.addMediaRouterButton(menu, R.id.media_route_menu_item);
// Set visibility depending on detail data
menu.findItem(R.id.action_imdb).setVisible(item.getImdbId() != null);
BookmarkManager.Bookmark b = bookmarkManager.findItem(this.item);
if (b != null && !b.isInternal()) {
menu.findItem(R.id.action_bookmark_on).setVisible(true);
menu.findItem(R.id.action_bookmark_off).setVisible(false);
} else {
menu.findItem(R.id.action_bookmark_on).setVisible(false);
menu.findItem(R.id.action_bookmark_off).setVisible(true);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
supportFinishAfterTransition();
//NavUtils.navigateUpFromSameTask(this);
return true;
} else if (id == R.id.action_share) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(Parser.getInstance().getPageLink(this.item)));
startActivity(intent);
return true;
} else if (id == R.id.action_imdb) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.imdb.com/title/" + this.item.getImdbId()));
startActivity(intent);
return true;
} else if (id == R.id.action_bookmark_on) {
//Remove bookmark
bookmarkManager.remove(new BookmarkManager.Bookmark(
Parser.getInstance().getParserId(),
Parser.getInstance().getPageLink(this.item))
);
//Show confirmation
Toast.makeText(getApplication(), getString(R.string.detail_bookmark_on_confirm), Toast.LENGTH_SHORT).show();
supportInvalidateOptionsMenu();
return true;
} else if (id == R.id.action_bookmark_off) {
//Add bookmark
bookmarkManager.addAsPublic(new BookmarkManager.Bookmark(
Parser.getInstance().getParserId(),
Parser.getInstance().getPageLink(this.item))
);
//Show confirmation
Toast.makeText(getApplication(), getString(R.string.detail_bookmark_off_confirm), Toast.LENGTH_SHORT).show();
supportInvalidateOptionsMenu();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
return mVideoCastManager.onDispatchVolumeKeyEvent(event, 0.05) || super.dispatchKeyEvent(event);
}
private void setMirrorSpinner(Host mirrors[]) {
if (mirrors != null && mirrors.length > 0) {
Arrays.sort(mirrors, new WeightedHostComparator(Utils.getWeightedHostList(getApplicationContext())));
((Spinner) findViewById(R.id.spinnerMirror)).setAdapter(
new ArrayAdapter<>(DetailActivity.this, android.R.layout.simple_list_item_1,
mirrors));
findViewById(R.id.spinnerMirror).setEnabled(true);
findViewById(R.id.buttonPlay).setEnabled(true);
} else {
((Spinner) findViewById(R.id.spinnerMirror)).setAdapter(
new ArrayAdapter<>(DetailActivity.this, android.R.layout.simple_list_item_1,
new String[]{getString(R.string.no_host_found)}));
findViewById(R.id.spinnerMirror).setEnabled(false);
findViewById(R.id.buttonPlay).setEnabled(false);
}
findViewById(R.id.layoutMirror).setVisibility(View.VISIBLE);
}
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
return this.onOptionsItemSelected(menuItem);
}
private class QueryDetailTask extends AsyncTask<Void, Void, Boolean> {
@Override
protected void onPreExecute() {
// Set loader for content
findViewById(R.id.buttonPlay).setEnabled(false);
super.onPreExecute();
}
@Override
protected Boolean doInBackground(Void... params) {
Map<String, String> articleParams = new HashMap<>();
articleParams.put("Name", item.getTitle());
articleParams.put("Type", item.getType() == ViewModel.Type.MOVIE ? "Movie" : "Series");
articleParams.put("Id", item.getSlug());
FlurryAgent.logEvent("Content_View", articleParams);
item = Parser.getInstance().loadDetail(item);
return true;
}
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
if (item.getType() == ViewModel.Type.SERIES) {
BookmarkManager.Bookmark b = bookmarkManager.findItem(item);
if (b != null) {
mRestoreSeasonIndex = b.getSeason();
mRestoreEpisodeIndex = b.getEpisode();
}
String seasons[] = new String[item.getSeasons().length];
for (int i = 0; i < seasons.length; i++) {
seasons[i] = String.valueOf(item.getSeasons()[i].id);
}
((Spinner) findViewById(R.id.spinnerSeason)).setAdapter(
new ArrayAdapter<>(DetailActivity.this, android.R.layout.simple_list_item_1, seasons));
if (mRestoreSeasonIndex != -1) {
((Spinner) findViewById(R.id.spinnerSeason)).setSelection(mRestoreSeasonIndex);
mRestoreSeasonIndex = -1;
}
findViewById(R.id.layoutSeries).setVisibility(View.VISIBLE);
} else {
findViewById(R.id.layoutSeries).setVisibility(View.GONE);
setMirrorSpinner(item.getMirrors());
}
ActivityCompat.invalidateOptionsMenu(DetailActivity.this);
}
}
private class QueryHosterTask extends AsyncTask<Void, Void, List<Host>> {
Season s;
int position;
@Override
protected void onPreExecute() {
super.onPreExecute();
findViewById(R.id.layoutMirror).setVisibility(View.GONE);
s = item.getSeasons()[((Spinner) findViewById(R.id.spinnerSeason)).getSelectedItemPosition()];
position = ((Spinner) findViewById(R.id.spinnerEpisode)).getSelectedItemPosition();
}
@Override
protected List<Host> doInBackground(Void... params) {
if (item.getType() == ViewModel.Type.SERIES) {
return Parser.getInstance().getHosterList(item, s.id, s.episodes[position]);
}
return null;
}
@Override
protected void onPostExecute(List<Host> list) {
super.onPostExecute(list);
setMirrorSpinner(list == null ? null : list.toArray(new Host[list.size()]));
}
}
public class QueryPlayTask extends AsyncTask<Void, String, String> {
private ProgressDialog progressDialog;
private Context context;
Host host;
int spinnerSeasonItemPosition;
int spinnerEpisodeItemPosition;
public QueryPlayTask(Context context) {
this.context = context;
progressDialog = new ProgressDialog(context);
progressDialog.setIndeterminate(true);
progressDialog.setMessage(getString(R.string.loading));
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(android.R.string.cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
cancel(true);
}
});
progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
cancel(true);
}
});
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();
//noinspection unchecked
ArrayAdapter<Host> hosts = (ArrayAdapter<Host>) ((Spinner) findViewById(R.id.spinnerMirror)).getAdapter();
host = hosts.getItem(((Spinner) findViewById(R.id.spinnerMirror)).getSelectedItemPosition());
spinnerSeasonItemPosition = ((Spinner) findViewById(R.id.spinnerSeason)).getSelectedItemPosition();
spinnerEpisodeItemPosition = ((Spinner) findViewById(R.id.spinnerEpisode)).getSelectedItemPosition();
}
@Override
protected void onCancelled() {
super.onCancelled();
progressDialog.dismiss();
}
public void updateProgress(String... values){
publishProgress(values);
}
@Override
protected String doInBackground(Void... params) {
String link;
if (item.getType() == ViewModel.Type.SERIES) {
Season s = item.getSeasons()[spinnerSeasonItemPosition];
String e = s.episodes[spinnerEpisodeItemPosition];
link = Parser.getInstance().getMirrorLink(this, item, host.getId(), host.getMirror(), s.id, e);
} else {
link = Parser.getInstance().getMirrorLink(this, item, host.getId(), host.getMirror());
}
host.setUrl(link);
return host.getVideoPath(this);
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
progressDialog.setMessage(getString(R.string.loading) + "\n" + values[0]);
}
@SuppressWarnings("deprecation")
@Override
protected void onPostExecute(final String link) {
super.onPostExecute(link);
progressDialog.dismiss();
if (!TextUtils.isEmpty(link)) {
Log.i("Play", "Getting player for '" + link + "'");
final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link));
intent.setDataAndType(Uri.parse(link), "video/mp4");
AlertDialog.Builder builder = new AlertDialog.Builder(DetailActivity.this);
builder.setTitle(getString(R.string.player_select_dialog_title));
PackageManager pm = getPackageManager();
List<ResolveInfo> launchables = pm.queryIntentActivities(intent, 0);
List<AppAdapter.App> apps = new ArrayList<>();
Collections.sort(launchables, new ResolveInfo.DisplayNameComparator(pm));
if (mVideoCastManager.isConnected()) {
apps.add(new AppAdapter.App(
getString(R.string.player_chromecast_list_entry),
getResources().getDrawable(R.drawable.ic_player_chromecast),
null
));
}
apps.add(new AppAdapter.App(
getString(R.string.player_internal_list_entry),
getResources().getDrawable(R.drawable.ic_player),
new ComponentName(DetailActivity.this, PlayerActivity.class)
));
for (ResolveInfo resolveInfo : launchables) {
ActivityInfo activity = resolveInfo.activityInfo;
AppAdapter.App app = new AppAdapter.App(
resolveInfo.loadLabel(pm),
resolveInfo.loadIcon(pm),
new ComponentName(activity.applicationInfo.packageName, activity.name)
);
apps.add(app);
}
final AppAdapter adapter = new AppAdapter(DetailActivity.this, apps, pm);
builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int position) {
AppAdapter.App app = adapter.getItem(position);
Map<String, String> articleParams = new HashMap<>();
articleParams.put("Name", item.getTitle());
articleParams.put("Type", item.getType() == ViewModel.Type.MOVIE ? "Movie" : "Series");
articleParams.put("Id", item.getSlug());
articleParams.put("Hoster", host.getName());
articleParams.put("Movie", item.getTitle());
if (app.getComponent() == null) {
startPlaybackOnChromecast(link);
articleParams.put("Player", "Chromecast");
} else {
intent.setComponent(app.getComponent());
articleParams.put("Player", app.getComponent().toString());
startActivity(intent);
}
FlurryAgent.logEvent("Played_Stream", articleParams);
dialog.dismiss();
}
});
final AlertDialog dialog = builder.create();
//dialog.getListView().setDivider(getResources().getDrawable(R.drawable.abc_list_divider_holo_light));
dialog.getListView().setDividerHeight(1);
dialog.show();
} else { // no link found
Toast.makeText(DetailActivity.this, getString(R.string.host_resolve_error), Toast.LENGTH_SHORT).show();
}
}
public Context getContext() {
return context;
}
}
public void startPlaybackOnChromecast(String link) {
MediaMetadata mediaMetadata;
if (item.getType() == ViewModel.Type.SERIES) {
Season s = item.getSeasons()[((Spinner) findViewById(R.id.spinnerSeason)).getSelectedItemPosition()];
String e = s.episodes[((Spinner) findViewById(R.id.spinnerEpisode)).getSelectedItemPosition()];
mediaMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_TV_SHOW);
mediaMetadata.putString(MediaMetadata.KEY_TITLE, item.getTitle() + " - Folge " + s.id + "x" + e);
} else {
mediaMetadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_MOVIE);
mediaMetadata.putString(MediaMetadata.KEY_TITLE, item.getTitle());
}
mediaMetadata.putString(MediaMetadata.KEY_SUBTITLE, getString(R.string.chromecast_subtitle));
// Use TheMovieDb to get the image
String url = getCachedImage(96, "poster");
Log.i("Chromecast", "use image: " + url);
if(TextUtils.isEmpty(url)) url = "http://kinocast.ov3rk1ll.com/img/kinocast_icon_512.png";
mediaMetadata.addImage(new WebImage(Uri.parse(url)));
// TODO Use Glide to get image
url = getCachedImage(getResources().getDisplayMetrics().widthPixels, "poster"); // new CoverImage(item.getImageRequest(getResources().getDisplayMetrics().widthPixels, "poster")).getBitmapUrl(getApplication());
Log.i("Chromecast", "use image: " + url);
if(TextUtils.isEmpty(url)) url = "http://kinocast.ov3rk1ll.com/img/kinocast_icon_512.png";
mediaMetadata.addImage(new WebImage(Uri.parse(url)));
Log.i("cast", "play " + link);
MediaInfo mediaInfo = new MediaInfo.Builder(link)
.setContentType("video/mp4")
.setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
.setMetadata(mediaMetadata)
.build();
mVideoCastManager.startVideoCastControllerActivity(DetailActivity.this, mediaInfo, 0, true);
}
/*public void startCastControllerActivity(Context context, Bundle mediaWrapper, int position, boolean shouldStart) {
Intent intent = new Intent(context, ColorfulVideoCastControllerActivity.class);
intent.putExtra(VideoCastManager.EXTRA_MEDIA, mediaWrapper);
intent.putExtra(VideoCastManager.EXTRA_START_POINT, position);
intent.putExtra(VideoCastManager.EXTRA_SHOULD_START, shouldStart);
intent.putExtra(ColorfulVideoCastControllerActivity.EXTRA_AB_COLOR, mActionBarBackgroundDrawable.getColor());
intent.putExtra(ColorfulVideoCastControllerActivity.EXTRA_TEXT_COLOR, mTitleColor);
context.startActivity(intent);
}*/
private String getCachedImage(int size, String type){
TheMovieDb tmdbCache = new TheMovieDb(getApplication());
String cacheUrl = Parser.getInstance().getPageLink(item);
JSONObject json = tmdbCache.get(cacheUrl, false);
if(json != null){
try {
String key = type + "_path";
if (type.equals("backdrop"))
return TheMovieDb.IMAGE_BASE_PATH + OkHttpViewModelStreamFetcher.getBackdropSize(size) + json.getString(key);
else
return TheMovieDb.IMAGE_BASE_PATH + OkHttpViewModelStreamFetcher.getPosterSize(size) + json.getString(key);
}catch (JSONException e){
e.printStackTrace();
}
}
return "";
}
static class AppAdapter extends ArrayAdapter<AppAdapter.App> {
PackageManager pm;
AppAdapter(Context context, List<AppAdapter.App> objects, PackageManager pm) {
super(context, R.layout.player_list_item, android.R.id.text1, objects);
this.pm = pm;
}
@NonNull
@Override
public View getView(int position, View convertView, @NonNull ViewGroup parent) {
App item = getItem(position);
View view = super.getView(position, convertView, parent);
((TextView) view.findViewById(android.R.id.text1)).setText(item.getLabel());
((ImageView) view.findViewById(android.R.id.icon)).setImageDrawable(item.getIcon());
return view;
}
@SuppressWarnings("unused")
static class App {
private CharSequence label;
private Drawable icon;
private ComponentName component;
App(CharSequence label, Drawable icon, ComponentName component) {
this.label = label;
this.icon = icon;
this.component = component;
}
CharSequence getLabel() {
return label;
}
public void setLabel(CharSequence label) {
this.label = label;
}
public Drawable getIcon() {
return icon;
}
public void setIcon(Drawable icon) {
this.icon = icon;
}
ComponentName getComponent() {
return component;
}
public void setComponent(ComponentName component) {
this.component = component;
}
}
}
}