package com.battlelancer.seriesguide.dashclock;
import android.content.Intent;
import android.database.Cursor;
import android.text.TextUtils;
import android.text.format.DateUtils;
import com.battlelancer.seriesguide.R;
import com.battlelancer.seriesguide.adapters.CalendarAdapter;
import com.battlelancer.seriesguide.settings.DashClockSettings;
import com.battlelancer.seriesguide.ui.ShowsActivity;
import com.battlelancer.seriesguide.util.DBUtils;
import com.battlelancer.seriesguide.util.TextTools;
import com.battlelancer.seriesguide.util.TimeTools;
import com.google.android.apps.dashclock.api.DashClockExtension;
import com.google.android.apps.dashclock.api.ExtensionData;
import java.util.Date;
public class UpcomingEpisodeExtension extends DashClockExtension {
@Override
protected void onInitialize(boolean isReconnect) {
super.onInitialize(isReconnect);
setUpdateWhenScreenOn(true);
}
@Override
protected void onUpdateData(int arg0) {
final Cursor upcomingEpisodes = DBUtils.getUpcomingEpisodes(getApplicationContext(), false,
true);
final long customCurrentTime = TimeTools.getCurrentTime(getApplicationContext());
int hourThreshold = DashClockSettings.getUpcomingTreshold(getApplicationContext());
long latestTimeToInclude = customCurrentTime + hourThreshold * DateUtils.HOUR_IN_MILLIS;
// Ensure there are episodes to show
if (upcomingEpisodes != null) {
if (upcomingEpisodes.moveToFirst()) {
// Ensure those episodes are within the user set time frame
long releaseTime = upcomingEpisodes
.getLong(CalendarAdapter.Query.RELEASE_TIME_MS);
if (releaseTime <= latestTimeToInclude) {
// build our DashClock panel
// title and episode of first show, like 'Title 1x01'
String expandedTitle = TextTools.getShowWithEpisodeNumber(
getApplicationContext(),
upcomingEpisodes.getString(CalendarAdapter.Query.SHOW_TITLE),
upcomingEpisodes.getInt(CalendarAdapter.Query.SEASON),
upcomingEpisodes.getInt(CalendarAdapter.Query.NUMBER)
);
// get the actual release time
Date actualRelease = TimeTools.applyUserOffset(this, releaseTime);
String absoluteTime = TimeTools.formatToLocalTime(this, actualRelease);
String releaseDay = TimeTools.formatToLocalDay(actualRelease);
// time and network, e.g. 'Mon 10:00, Network'
StringBuilder expandedBody = new StringBuilder();
if (!DateUtils.isToday(actualRelease.getTime())) {
expandedBody.append(releaseDay).append(" ");
}
expandedBody.append(absoluteTime);
String network = upcomingEpisodes
.getString(CalendarAdapter.Query.SHOW_NETWORK);
if (!TextUtils.isEmpty(network)) {
expandedBody.append(" — ").append(network);
}
// more than one episode at this time? Append e.g. '3 more'
int additionalEpisodes = 0;
while (upcomingEpisodes.moveToNext()
&& releaseTime == upcomingEpisodes
.getLong(CalendarAdapter.Query.RELEASE_TIME_MS)) {
additionalEpisodes++;
}
if (additionalEpisodes > 0) {
expandedBody.append("\n");
expandedBody.append(getString(R.string.more, additionalEpisodes));
}
publishUpdate(new ExtensionData()
.visible(true)
.icon(R.drawable.ic_notification)
// 'Fri\n15:00'
.status(releaseDay + "\n" + absoluteTime)
.expandedTitle(expandedTitle)
.expandedBody(expandedBody.toString())
.clickIntent(
new Intent(getApplicationContext(),
ShowsActivity.class)
.putExtra(
ShowsActivity.InitBundle.SELECTED_TAB,
ShowsActivity.InitBundle.INDEX_TAB_UPCOMING)));
upcomingEpisodes.close();
return;
}
}
upcomingEpisodes.close();
}
// nothing to show
publishUpdate(null);
}
}