package de.tum.in.tumcampusapp.cards;
import android.app.Notification;
import android.app.SearchManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v4.app.NotificationCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RemoteViews;
import android.widget.TextView;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import de.tum.in.tumcampusapp.R;
import de.tum.in.tumcampusapp.activities.CalendarActivity;
import de.tum.in.tumcampusapp.activities.RoomFinderActivity;
import de.tum.in.tumcampusapp.auxiliary.DateUtils;
import de.tum.in.tumcampusapp.auxiliary.Utils;
import de.tum.in.tumcampusapp.cards.generic.Card;
import de.tum.in.tumcampusapp.cards.generic.NotificationAwareCard;
import de.tum.in.tumcampusapp.managers.CardManager;
public class NextLectureCard extends NotificationAwareCard {
private static final String NEXT_LECTURE_DATE = "next_date";
private final static int[] IDS = {
R.id.lecture_1,
R.id.lecture_2,
R.id.lecture_3,
R.id.lecture_4
};
private TextView mLocation;
private final List<CalendarItem> lectures = new ArrayList<>();
private TextView mTimeView;
private int mSelected;
private TextView mEvent;
public NextLectureCard(Context context) {
super(CardManager.CARD_NEXT_LECTURE, context, "card_next_lecture");
}
public static Card.CardViewHolder inflateViewHolder(ViewGroup parent) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_next_lecture_item, parent, false);
return new Card.CardViewHolder(view);
}
@Override
public String getTitle() {
return lectures.get(mSelected).title;
}
@Override
public void updateViewHolder(RecyclerView.ViewHolder viewHolder) {
super.updateViewHolder(viewHolder);
mCard = viewHolder.itemView;
mLinearLayout = (LinearLayout) mCard.findViewById(R.id.card_view);
mTitleView = (TextView) mCard.findViewById(R.id.card_title);
mTimeView = (TextView) mCard.findViewById(R.id.card_time);
mLocation = (TextView) mCard.findViewById(R.id.card_location_action);
mEvent = (TextView) mCard.findViewById(R.id.card_event_action);
showItem(0);
int i = 0;
if (lectures.size() > 1) {
for (; i < lectures.size(); i++) {
final int j = i;
Button text = (Button) mCard.findViewById(IDS[i]);
text.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showItem(j);
}
});
}
}
for (; i < 4; i++) {
View text = mCard.findViewById(IDS[i]);
text.setVisibility(View.GONE);
}
}
void showItem(int sel) {
// Set selection on the buttons
mSelected = sel;
for (int i = 0; i < 4; i++) {
mCard.findViewById(IDS[i]).setSelected(i == sel);
}
final CalendarItem item = lectures.get(sel);
// Set current title
mTitleView.setText(getTitle());
//Add content
mTimeView.setText(DateUtils.getFutureTime(item.start, mContext));
//Add location with link to room finder
if (item.location == null || item.location.isEmpty()) {
mLocation.setVisibility(View.GONE);
} else {
mLocation.setText(item.location);
mLocation.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(mContext, RoomFinderActivity.class);
i.putExtra(SearchManager.QUERY, item.location);
mContext.startActivity(i);
}
});
}
DateFormat week = new SimpleDateFormat("EEEE, ", Locale.getDefault());
DateFormat df = SimpleDateFormat.getTimeInstance(DateFormat.SHORT);
mEvent.setText(String.format("%s%s - %s", week.format(item.start), df.format(item.start), df.format(item.end)));
mEvent.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(mContext, CalendarActivity.class);
CalendarItem item = lectures.get(mSelected);
i.putExtra(CalendarActivity.EVENT_TIME, item.start.getTime());
mContext.startActivity(i);
}
});
}
@Override
protected void discard(Editor editor) {
CalendarItem item = lectures.get(lectures.size() - 1);
editor.putLong(NEXT_LECTURE_DATE, item.start.getTime());
}
@Override
protected boolean shouldShow(SharedPreferences prefs) {
CalendarItem item = lectures.get(0);
long prevTime = prefs.getLong(NEXT_LECTURE_DATE, 0);
return item.start.getTime() > prevTime;
}
@Override
public Intent getIntent() {
return null;
}
@Override
public int getId() {
return 0;
}
@Override
protected Notification fillNotification(NotificationCompat.Builder notificationBuilder) {
CalendarItem item = lectures.get(0);
final String time = DateUtils.getFutureTime(item.start, mContext);
notificationBuilder.setContentText(item.title + '\n' + time);
Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.wear_next_lecture);
notificationBuilder.extend(new NotificationCompat.WearableExtender().setBackground(bm));
return notificationBuilder.build();
}
public void setLectures(Cursor cur) {
do {
CalendarItem item = new CalendarItem();
item.start = Utils.getISODateTime(cur.getString(1));
item.end = Utils.getISODateTime(cur.getString(2));
// Extract course title
item.title = cur.getString(0);
item.title = item.title.replaceAll("[A-Z, 0-9(LV\\.Nr)=]+$", "");
item.title = item.title.replaceAll("\\([A-Z]+[0-9]+\\)", "");
item.title = item.title.replaceAll("\\[[A-Z]+[0-9]+\\]", "");
item.title = item.title.trim();
// Handle location
item.location = cur.getString(3);
if (item.location != null) {
item.location = item.location.replaceAll("\\([A-Z0-9\\.]+\\)", "").trim();
}
lectures.add(item);
} while (cur.moveToNext());
cur.close();
}
private static class CalendarItem {
String title;
Date start;
Date end;
String location;
}
@Override
public RemoteViews getRemoteViews(Context context) {
final RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.cards_widget_card);
remoteViews.setTextViewText(R.id.widgetCardTextView, this.getTitle());
remoteViews.setImageViewResource(R.id.widgetCardImageView, R.drawable.ic_my_lectures);
return remoteViews;
}
}