/** * Tries to download art from the thetvdb banner mirror. Ignores blank ("") or null paths and * skips existing images. Returns true even if there was no art downloaded. * * @param fileName of image * @param isPoster * @param context * @return false if not all images could be fetched. true otherwise, even if nothing was * downloaded */ public static boolean fetchArt(String fileName, boolean isPoster, Context context) { if (TextUtils.isEmpty(fileName) || context == null) { return true; } final ImageProvider imageProvider = ImageProvider.getInstance(context); if (!imageProvider.exists(fileName)) { final String imageUrl; if (isPoster) { // the cached version is a lot smaller, but still big enough for // our purposes imageUrl = mirror_banners + "/_cache/" + fileName; } else { imageUrl = mirror_banners + "/" + fileName; } // try to download, decode and store the image final Bitmap bitmap = downloadBitmap(imageUrl); if (bitmap != null) { imageProvider.storeImage(fileName, bitmap, isPoster); } else { return false; } } return true; }
@Override public void onLowMemory() { if (!AndroidUtils.isICSOrHigher()) { // clear the whole cache as Honeycomb and below don't support // onTrimMemory (used directly in our ImageProvider) ImageProvider.getInstance(this).clearCache(); } }
@Override public View getView(int position, View convertView, ViewGroup parent) { if (!mDataValid) { throw new IllegalStateException("this should only be called when the cursor is valid"); } if (!mCursor.moveToPosition(position)) { throw new IllegalStateException("couldn't move cursor to position " + position); } final ViewHolder viewHolder; if (convertView == null) { convertView = mLayoutInflater.inflate(LAYOUT, null); viewHolder = new ViewHolder(); viewHolder.name = (TextView) convertView.findViewById(R.id.seriesname); viewHolder.timeAndNetwork = (TextView) convertView.findViewById(R.id.textViewShowsTimeAndNetwork); viewHolder.episode = (TextView) convertView.findViewById(R.id.TextViewShowListNextEpisode); viewHolder.episodeTime = (TextView) convertView.findViewById(R.id.episodetime); viewHolder.poster = (ImageView) convertView.findViewById(R.id.showposter); viewHolder.favorited = (ImageView) convertView.findViewById(R.id.favoritedLabel); viewHolder.contextMenu = (ImageView) convertView.findViewById(R.id.imageViewShowsContextMenu); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } // set text properties immediately viewHolder.name.setText(mCursor.getString(ShowsQuery.TITLE)); // favorite toggle final String showId = mCursor.getString(ShowsQuery._ID); final boolean isFavorited = mCursor.getInt(ShowsQuery.FAVORITE) == 1; viewHolder.favorited.setImageResource(isFavorited ? mStarDrawableId : mStarZeroDrawableId); viewHolder.favorited.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { onFavoriteShow(showId, !isFavorited); } }); // next episode info String fieldValue = mCursor.getString(ShowsQuery.NEXTTEXT); if (fieldValue.length() == 0) { // show show status if there are currently no more // episodes int status = mCursor.getInt(ShowsQuery.STATUS); // Continuing == 1 and Ended == 0 if (status == 1) { viewHolder.episodeTime.setText(getString(R.string.show_isalive)); } else if (status == 0) { viewHolder.episodeTime.setText(getString(R.string.show_isnotalive)); } else { viewHolder.episodeTime.setText(""); } viewHolder.episode.setText(""); } else { viewHolder.episode.setText(fieldValue); fieldValue = mCursor.getString(ShowsQuery.NEXTAIRDATETEXT); viewHolder.episodeTime.setText(fieldValue); } // airday final String[] values = Utils.parseMillisecondsToTime( mCursor.getLong(ShowsQuery.AIRSTIME), mCursor.getString(ShowsQuery.AIRSDAYOFWEEK), mContext); if (getResources().getBoolean(R.bool.isLargeTablet)) { // network first, then time, one line viewHolder.timeAndNetwork.setText( mCursor.getString(ShowsQuery.NETWORK) + " / " + values[1] + " " + values[0]); } else { // smaller screen, time first, network second line viewHolder.timeAndNetwork.setText( values[1] + " " + values[0] + "\n" + mCursor.getString(ShowsQuery.NETWORK)); } // set poster final String imagePath = mCursor.getString(ShowsQuery.POSTER); ImageProvider.getInstance(mContext).loadPosterThumb(viewHolder.poster, imagePath); // context menu viewHolder.contextMenu.setVisibility(View.VISIBLE); viewHolder.contextMenu.setOnClickListener(mOnClickListener); return convertView; }
@TargetApi(11) private void fillData() { TextView seriesname = (TextView) findViewById(R.id.title); TextView overview = (TextView) findViewById(R.id.TextViewShowInfoOverview); TextView airstime = (TextView) findViewById(R.id.TextViewShowInfoAirtime); TextView network = (TextView) findViewById(R.id.TextViewShowInfoNetwork); TextView status = (TextView) findViewById(R.id.TextViewShowInfoStatus); final Series show = DBUtils.getShow(this, String.valueOf(getShowId())); if (show == null) { finish(); return; } // Name seriesname.setText(show.getSeriesName()); // Overview if (show.getOverview().length() == 0) { overview.setText(""); } else { overview.setText(show.getOverview()); } // Airtimes if (show.getAirsDayOfWeek().length() == 0 || show.getAirsTime() == -1) { airstime.setText(getString(R.string.show_noairtime)); } else { String[] values = Utils.parseMillisecondsToTime( show.getAirsTime(), show.getAirsDayOfWeek(), getApplicationContext()); airstime.setText(getString(R.string.show_airs) + " " + values[1] + " " + values[0]); } // Network if (show.getNetwork().length() == 0) { network.setText(""); } else { network.setText(getString(R.string.show_network) + " " + show.getNetwork()); } // Running state if (show.getStatus() == 1) { status.setTextColor(Color.GREEN); status.setText(getString(R.string.show_isalive)); } else if (show.getStatus() == 0) { status.setTextColor(Color.GRAY); status.setText(getString(R.string.show_isnotalive)); } // first airdate long airtime = Utils.buildEpisodeAirtime(show.getFirstAired(), show.getAirsTime()); Utils.setValueOrPlaceholder( findViewById(R.id.TextViewShowInfoFirstAirdate), Utils.formatToDate(airtime, this)); // Others Utils.setValueOrPlaceholder( findViewById(R.id.TextViewShowInfoActors), Utils.splitAndKitTVDBStrings(show.getActors())); Utils.setValueOrPlaceholder( findViewById(R.id.TextViewShowInfoContentRating), show.getContentRating()); Utils.setValueOrPlaceholder( findViewById(R.id.TextViewShowInfoGenres), Utils.splitAndKitTVDBStrings(show.getGenres())); Utils.setValueOrPlaceholder( findViewById(R.id.TextViewShowInfoRuntime), show.getRuntime() + " " + getString(R.string.show_airtimeunit)); // TVDb rating String ratingText = show.getRating(); if (ratingText != null && ratingText.length() != 0) { RatingBar ratingBar = (RatingBar) findViewById(R.id.bar); ratingBar.setProgress((int) (Double.valueOf(ratingText) / 0.1)); TextView rating = (TextView) findViewById(R.id.value); rating.setText(ratingText + "/10"); } // IMDb button View imdbButton = (View) findViewById(R.id.buttonShowInfoIMDB); final String imdbid = show.getImdbId(); if (imdbButton != null) { imdbButton.setOnClickListener( new OnClickListener() { public void onClick(View v) { fireTrackerEvent("Show IMDb page"); if (imdbid.length() != 0) { Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("imdb:///title/" + imdbid + "/")); try { startActivity(myIntent); } catch (ActivityNotFoundException e) { myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(IMDB_TITLE_URL + imdbid)); startActivity(myIntent); } } else { Toast.makeText( getApplicationContext(), getString(R.string.show_noimdbentry), Toast.LENGTH_LONG) .show(); } } }); } // TVDb button View tvdbButton = (View) findViewById(R.id.buttonTVDB); final String tvdbId = show.getId(); if (tvdbButton != null) { tvdbButton.setOnClickListener( new OnClickListener() { public void onClick(View v) { fireTrackerEvent("Show TVDb page"); Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(Constants.TVDB_SHOW_URL + tvdbId)); startActivity(i); } }); } // Shout button findViewById(R.id.buttonShouts) .setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { fireTrackerEvent("Show Trakt Shouts"); TraktShoutsFragment newFragment = TraktShoutsFragment.newInstance(show.getSeriesName(), Integer.valueOf(tvdbId)); newFragment.show(getSupportFragmentManager(), "shouts-dialog"); } }); // Share intent mShareIntentBuilder = ShareCompat.IntentBuilder.from(this) .setChooserTitle(R.string.share) .setText( getString(R.string.share_checkout) + " \"" + show.getSeriesName() + "\" via @SeriesGuide " + ShowInfoActivity.IMDB_TITLE_URL + imdbid) .setType("text/plain"); // Poster final ImageView poster = (ImageView) findViewById(R.id.ImageViewShowInfoPoster); ImageProvider.getInstance(this).loadImage(poster, show.getPoster(), false); // trakt ratings TraktSummaryTask task = new TraktSummaryTask(this, findViewById(R.id.ratingbar)).show(tvdbId); AndroidUtils.executeAsyncTask(task, new Void[] {null}); }
private void onNotify( final SharedPreferences prefs, final Cursor upcomingEpisodes, int count, long latestAirtime) { final Context context = getApplicationContext(); CharSequence tickerText = ""; CharSequence contentTitle = ""; CharSequence contentText = ""; PendingIntent contentIntent = null; // notification sound final String ringtoneUri = NotificationSettings.getNotificationsRingtone(context); // vibration final boolean isVibrating = NotificationSettings.isNotificationVibrating(context); if (count == 1) { // notify in detail about one episode upcomingEpisodes.moveToFirst(); final String showTitle = upcomingEpisodes.getString(NotificationQuery.SHOW_TITLE); final String airs = Utils.formatToTimeAndDay(upcomingEpisodes.getLong(NotificationQuery.FIRSTAIREDMS), this)[ 0]; final String network = upcomingEpisodes.getString(NotificationQuery.NETWORK); tickerText = getString(R.string.upcoming_show, showTitle); contentTitle = showTitle + " " + Utils.getEpisodeNumber( this, upcomingEpisodes.getInt(NotificationQuery.SEASON), upcomingEpisodes.getInt(NotificationQuery.NUMBER)); contentText = getString(R.string.upcoming_show_detailed, airs, network); Intent notificationIntent = new Intent(context, EpisodesActivity.class); notificationIntent.putExtra( EpisodesActivity.InitBundle.EPISODE_TVDBID, upcomingEpisodes.getInt(NotificationQuery._ID)); notificationIntent.putExtra(KEY_EPISODE_CLEARED_TIME, latestAirtime); contentIntent = PendingIntent.getActivity(context, REQUEST_CODE_SINGLE_EPISODE, notificationIntent, 0); } else if (count > 1) { // notify about multiple episodes tickerText = getString(R.string.upcoming_episodes); contentTitle = getString(R.string.upcoming_episodes_number, count); contentText = getString(R.string.upcoming_display); Intent notificationIntent = new Intent(context, UpcomingRecentActivity.class); notificationIntent.putExtra(KEY_EPISODE_CLEARED_TIME, latestAirtime); contentIntent = PendingIntent.getActivity(context, REQUEST_CODE_MULTIPLE_EPISODES, notificationIntent, 0); } final NotificationCompat.Builder nb = new NotificationCompat.Builder(context); if (AndroidUtils.isJellyBeanOrHigher()) { // JELLY BEAN and above if (count == 1) { // single episode upcomingEpisodes.moveToFirst(); final String imagePath = upcomingEpisodes.getString(NotificationQuery.POSTER); nb.setLargeIcon(ImageProvider.getInstance(context).getImage(imagePath, true)); final String episodeTitle = upcomingEpisodes.getString(NotificationQuery.TITLE); final String episodeSummary = upcomingEpisodes.getString(NotificationQuery.OVERVIEW); final SpannableStringBuilder bigText = new SpannableStringBuilder(); bigText.append(episodeTitle); bigText.setSpan(new ForegroundColorSpan(Color.WHITE), 0, bigText.length(), 0); bigText.append("\n"); bigText.append(episodeSummary); nb.setStyle( new NotificationCompat.BigTextStyle().bigText(bigText).setSummaryText(contentText)); // Action button to check in Intent checkInActionIntent = new Intent(context, QuickCheckInActivity.class); checkInActionIntent.putExtra( QuickCheckInActivity.InitBundle.EPISODE_TVDBID, upcomingEpisodes.getInt(NotificationQuery._ID)); PendingIntent checkInIntent = PendingIntent.getActivity(context, REQUEST_CODE_ACTION_CHECKIN, checkInActionIntent, 0); nb.addAction(R.drawable.ic_action_checkin, getString(R.string.checkin), checkInIntent); } else { // multiple episodes NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); // display at most the first five final int displayCount = Math.min(count, 5); for (int i = 0; i < displayCount; i++) { if (upcomingEpisodes.moveToPosition(i)) { // add show title, air time and network final SpannableStringBuilder lineText = new SpannableStringBuilder(); lineText.append(upcomingEpisodes.getString(NotificationQuery.SHOW_TITLE)); lineText.setSpan(new ForegroundColorSpan(Color.WHITE), 0, lineText.length(), 0); lineText.append(" "); String airs = Utils.formatToTimeAndDay( upcomingEpisodes.getLong(NotificationQuery.FIRSTAIREDMS), this)[0]; String network = upcomingEpisodes.getString(NotificationQuery.NETWORK); lineText.append(getString(R.string.upcoming_show_detailed, airs, network)); inboxStyle.addLine(lineText); } } // tell if we could not display all episodes if (count > 5) { inboxStyle.setSummaryText(getString(R.string.more, count - 5)); } nb.setStyle(inboxStyle); nb.setContentInfo(String.valueOf(count)); } } else { // ICS and below if (count == 1) { // single episode upcomingEpisodes.moveToFirst(); final String posterPath = upcomingEpisodes.getString(NotificationQuery.POSTER); nb.setLargeIcon(ImageProvider.getInstance(context).getImage(posterPath, true)); } } // If the string is empty, the user chose silent... if (ringtoneUri.length() != 0) { // ...otherwise set the specified ringtone nb.setSound(Uri.parse(ringtoneUri)); } if (isVibrating) { nb.setVibrate(VIBRATION_PATTERN); } nb.setDefaults(Notification.DEFAULT_LIGHTS); nb.setWhen(System.currentTimeMillis()); nb.setAutoCancel(true); nb.setTicker(tickerText); nb.setContentTitle(contentTitle); nb.setContentText(contentText); nb.setContentIntent(contentIntent); nb.setSmallIcon(R.drawable.ic_notification); nb.setPriority(NotificationCompat.PRIORITY_DEFAULT); Intent i = new Intent(this, NotificationService.class); i.putExtra(KEY_EPISODE_CLEARED_TIME, latestAirtime); PendingIntent deleteIntent = PendingIntent.getService(this, 1, i, 0); nb.setDeleteIntent(deleteIntent); // build the notification Notification notification = nb.build(); // use string resource id, always unique within app final NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); nm.notify(R.string.upcoming_show, notification); }