package de.tum.in.tumcampusapp.cards; import android.app.Notification; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; 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.LinearLayout; import android.widget.RemoteViews; import android.widget.TextView; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import de.tum.in.tumcampusapp.R; import de.tum.in.tumcampusapp.activities.CafeteriaActivity; import de.tum.in.tumcampusapp.auxiliary.CafeteriaPrices; import de.tum.in.tumcampusapp.auxiliary.Const; import de.tum.in.tumcampusapp.cards.generic.NotificationAwareCard; import de.tum.in.tumcampusapp.models.cafeteria.CafeteriaMenu; import static de.tum.in.tumcampusapp.fragments.CafeteriaDetailsSectionFragment.showMenu; import static de.tum.in.tumcampusapp.managers.CardManager.CARD_CAFETERIA; /** * Card that shows the cafeteria menu */ public class CafeteriaMenuCard extends NotificationAwareCard { private static final String CAFETERIA_DATE = "cafeteria_date"; private static final Pattern COMPILE = Pattern.compile("\\([^\\)]+\\)"); private static final Pattern PATTERN = Pattern.compile("[0-9]"); private int mCafeteriaId; private String mCafeteriaName; private Date mDate; private String mDateStr; private List<CafeteriaMenu> mMenus; public CafeteriaMenuCard(Context context) { super(CARD_CAFETERIA, context, "card_cafeteria"); } public static CardViewHolder inflateViewHolder(ViewGroup parent) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_item, parent, false); return new CardViewHolder(view); } @Override public void updateViewHolder(RecyclerView.ViewHolder viewHolder) { super.updateViewHolder(viewHolder); CardViewHolder cardsViewHolder = (CardViewHolder) viewHolder; List<View> addedViews = cardsViewHolder.getAddedViews(); mCard = viewHolder.itemView; mLinearLayout = (LinearLayout) mCard.findViewById(R.id.card_view); mTitleView = (TextView) mCard.findViewById(R.id.card_title); mTitleView.setText(getTitle()); // Show date TextView mDateView = (TextView) mCard.findViewById(R.id.card_date); mDateView.setVisibility(View.VISIBLE); mDateView.setText(SimpleDateFormat.getDateInstance().format(mDate)); //Remove additional views for (View view : addedViews) { mLinearLayout.removeView(view); } // Show cafeteria menu cardsViewHolder.setAddedViews(showMenu(mLinearLayout, mCafeteriaId, mDateStr, false)); } /** * Sets the information needed to build the card * * @param id Cafeteria id * @param name Cafeteria name * @param dateStr Date of the menu in yyyy-mm-dd format * @param date Date of the menu * @param menus List of cafeteria menus */ public void setCardMenus(int id, String name, String dateStr, Date date, List<CafeteriaMenu> menus) { mCafeteriaId = id; mCafeteriaName = name; mDateStr = dateStr; mDate = date; mMenus = menus; } @Override public String getTitle() { return mCafeteriaName; } @Override public Intent getIntent() { Intent i = new Intent(mContext, CafeteriaActivity.class); i.putExtra(Const.CAFETERIA_ID, mCafeteriaId); return i; } @Override public int getId() { return 0; } @Override public void discard(Editor editor) { editor.putLong(CAFETERIA_DATE, mDate.getTime()); } @Override protected boolean shouldShow(SharedPreferences prefs) { final long prevDate = prefs.getLong(CAFETERIA_DATE, 0); return prevDate < mDate.getTime(); } @Override protected Notification fillNotification(NotificationCompat.Builder notificationBuilder) { Map<String, String> rolePrices = CafeteriaPrices.getRolePrices(mContext); NotificationCompat.WearableExtender morePageNotification = new NotificationCompat.WearableExtender(); StringBuilder allContent = new StringBuilder(); StringBuilder firstContent = new StringBuilder(); for (CafeteriaMenu menu : mMenus) { if ("bei".equals(menu.typeShort)) { continue; } NotificationCompat.Builder pageNotification = new NotificationCompat.Builder(mContext) .setContentTitle(PATTERN.matcher(menu.typeLong).replaceAll("").trim()); StringBuilder content = new StringBuilder(menu.name); if (rolePrices.containsKey(menu.typeLong)) { content.append('\n').append(rolePrices.get(menu.typeLong)).append(" €"); } String contentString = COMPILE.matcher(content.toString()).replaceAll("").trim(); pageNotification.setContentText(contentString); if ("tg".equals(menu.typeShort)) { if (!allContent.toString().isEmpty()) { allContent.append('\n'); } allContent.append(contentString); } if (firstContent.toString().isEmpty()) { firstContent.append(COMPILE.matcher(menu.name).replaceAll("").trim()).append('…'); } else { morePageNotification.addPage(pageNotification.build()); } } notificationBuilder.setWhen(mDate.getTime()); notificationBuilder.setContentText(firstContent); notificationBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(allContent)); Bitmap bm = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.wear_cafeteria); morePageNotification.setBackground(bm); return morePageNotification.extend(notificationBuilder).build(); } @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_cutlery); return remoteViews; } }