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; } } } }