package de.lukasniemeier.mensa.ui; import android.app.Activity; import android.content.Intent; import android.provider.CalendarContract; import android.view.ActionMode; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ShareActionProvider; import java.text.SimpleDateFormat; import de.lukasniemeier.mensa.R; import de.lukasniemeier.mensa.model.Meal; import de.lukasniemeier.mensa.ui.adapter.CardAdapter; import de.lukasniemeier.mensa.ui.adapter.OnPageChangeListener; import de.lukasniemeier.mensa.utils.SerializableTime; import de.lukasniemeier.mensa.utils.Utils; /** * Created on 26.11.13. */ public class MealContextHandler implements ActionMode.Callback, AdapterView.OnItemLongClickListener, AdapterView.OnItemClickListener, OnPageChangeListener { private final Activity activity; private final CardAdapter<Meal> adapter; private ActionMode actionMode; private View selectedView; private ShareActionProvider shareActionProvider; private Intent reminderIntent; public MealContextHandler(Activity activity, CardAdapter<Meal> adapter) { this.activity = activity; this.adapter = adapter; this.selectedView = null; } @Override public boolean onCreateActionMode(ActionMode mode, android.view.Menu menu) { MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.meal_context_menu, menu); MenuItem shareItem = menu.findItem(R.id.action_meal_share); shareActionProvider = (ShareActionProvider) shareItem.getActionProvider(); return true; } @Override public boolean onPrepareActionMode(ActionMode mode, android.view.Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.action_meal_reminder: if (reminderIntent != null) { activity.startActivity(reminderIntent); } return true; default: return false; } } @Override public void onDestroyActionMode(ActionMode mode) { if (selectedView != null) { selectedView.setSelected(false); } actionMode = null; } @Override public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long l) { if (actionMode != null) { return false; } actionMode = activity.startActionMode(this); selectedView = view; selectedView.setSelected(true); setIntents(adapter.getItem(position).getValue()); return true; } @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { finish(); } @Override public void onPageChange(boolean isShown) { if (!isShown) { finish(); } } public void finish() { if (selectedView != null) { selectedView.setSelected(false); } if (actionMode != null) { actionMode.finish(); } selectedView = null; } private void setIntents(Meal meal) { setReminderIntent(meal); setShareIntent(meal); } private void setReminderIntent(Meal meal) { SerializableTime beginTime = meal.getMenu().getMenuDay(); SerializableTime endTime = new SerializableTime(beginTime.getTime()); reminderIntent = new Intent(Intent.ACTION_INSERT) .setData(CalendarContract.Events.CONTENT_URI) .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.toMillis()) .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.toMillis()) .putExtra(CalendarContract.Events.TITLE, meal.getName()) .putExtra(CalendarContract.Events.DESCRIPTION, meal.getDescription()) .putExtra(CalendarContract.Events.EVENT_LOCATION, meal.getMenu().getWeeklyMenu().getMensa().getName()) .putExtra(CalendarContract.Events.AVAILABILITY, CalendarContract.Events.AVAILABILITY_FREE); } private void setShareIntent(Meal meal) { if (shareActionProvider != null) { Intent shareIntent = new Intent(); shareIntent.setAction(Intent.ACTION_SEND); shareIntent.putExtra(Intent.EXTRA_TEXT, getShareText(meal)); shareIntent.setType("text/plain"); shareActionProvider.setShareIntent(shareIntent); } } private String getShareText(Meal meal) { SerializableTime time = Utils.now(); SerializableTime mealDay = meal.getMenu().getMenuDay(); String mealDayText; if (mealDay.getYearDay() - time.getYearDay() >= 7) { mealDayText = Utils.formatDate(activity, mealDay, new SimpleDateFormat("cccc (d.MM)")); } else { mealDayText = Utils.formatDate(activity, mealDay, new SimpleDateFormat("cccc")); } return activity.getString(R.string.share_meal, meal.getMenu().getWeeklyMenu().getMensa().getShortName(), mealDayText, meal.getName(), meal.getDescription()); } }