package com.thebluealliance.androidclient.listeners; import com.thebluealliance.androidclient.TbaLogger; import com.thebluealliance.androidclient.activities.TeamAtEventActivity; import com.thebluealliance.androidclient.activities.ViewTeamActivity; import com.thebluealliance.androidclient.adapters.ListViewAdapter; import com.thebluealliance.androidclient.helpers.AnalyticsHelper; import com.thebluealliance.androidclient.helpers.EventHelper; import com.thebluealliance.androidclient.helpers.EventTeamHelper; import com.thebluealliance.androidclient.helpers.TeamHelper; import com.thebluealliance.androidclient.listitems.ListElement; import android.content.Context; import android.content.Intent; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; import android.view.View; import android.widget.AdapterView; /** * General click handler for Team@Event items. Can be used with both long and short clicks on both * individual views and AdapterView items. * * To be used as a simple View click listener, you have several options: * <ul> * <li>Pass a valid EventTeam key in the constructor</li> * <li>Pass both an event key and a team key in the constructor</li> * <li>Pass just an event key in the constructor, and use a team key as the view's tag</li> * <li>Use an EventTeam key as the view's tag</li> * </ul> * * To be used as an AdapterView item click listener, the AdapterView's adapter should be an * instance of {@link ListViewAdapter} and the item at the clicked position should be an instance * of * {@link ListElement}. The element's key can be either a Team key (such as frc254) or an EventTeam * key (such as 2016cmp_frc254). If the key is just a team key, a valid event key should be * provided in the constructor. */ public class EventTeamClickListener implements View.OnClickListener, View.OnLongClickListener, AdapterView.OnItemClickListener, AdapterView.OnItemLongClickListener { private Context mContext; private String mEventKey, mTeamKey; public EventTeamClickListener(@NonNull Context c) { super(); mContext = c; mEventKey = null; mTeamKey = null; } public EventTeamClickListener(@NonNull Context c, @NonNull String eventTeamKey) { super(); mContext = c; if (EventTeamHelper.validateEventTeamKey(eventTeamKey)) { mEventKey = EventTeamHelper.getEventKey(eventTeamKey); mTeamKey = EventTeamHelper.getTeamKey(eventTeamKey); } else { TbaLogger.w("EventTeamClickListener created with invalid EventTeam key! " + eventTeamKey); mEventKey = null; mTeamKey = null; } } public EventTeamClickListener(@NonNull Context c, @NonNull String eventKey, @Nullable String teamKey) { super(); mContext = c; mEventKey = eventKey; mTeamKey = teamKey; } @Override public void onClick(View v) { String[] keys = getKeysFromTag(v.getTag()); String eventKey = keys[0]; String teamKey = keys[1]; handleClick(eventKey, teamKey); } @Override public boolean onLongClick(View v) { String[] keys = getKeysFromTag(v.getTag()); String eventKey = keys[0]; String teamKey = keys[1]; return handleLongClick(eventKey, teamKey); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // Attempt to get team key out of the adapter view String[] keys = getKeysFromTag(getKeyFromAdapterView(parent, position)); String eventKey = keys[0]; String teamKey = keys[1]; handleClick(eventKey, teamKey); } @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { String[] keys = getKeysFromTag(getKeyFromAdapterView(parent, position)); String eventKey = keys[0]; String teamKey = keys[1]; return handleLongClick(eventKey, teamKey); } private void handleClick(String eventKey, String teamKey) { if (TeamHelper.validateTeamKey(teamKey) ^ TeamHelper.validateMultiTeamKey(teamKey)) { teamKey = TeamHelper.baseTeamKey(teamKey); Intent intent; if (EventHelper.validateEventKey(eventKey)) { intent = TeamAtEventActivity.newInstance(mContext, eventKey, teamKey); } else { intent = ViewTeamActivity.newInstance(mContext, teamKey); } AnalyticsHelper.sendClickUpdate(mContext, "team@event_click", EventTeamHelper.generateKey(eventKey, teamKey), ""); mContext.startActivity(intent); } } private boolean handleLongClick(String eventKey, String teamKey) { boolean didHandleClick = false; if (TeamHelper.validateTeamKey(teamKey) ^ TeamHelper.validateMultiTeamKey(teamKey)) { teamKey = TeamHelper.baseTeamKey(teamKey); if (EventHelper.validateEventKey(eventKey)) { showViewEventTeamDialog(eventKey, teamKey); didHandleClick = true; } AnalyticsHelper.sendClickUpdate(mContext, "team@event_longclick", EventTeamHelper.generateKey(eventKey, teamKey), ""); } return didHandleClick; } String[] getKeysFromTag(Object tagObject) { String eventKey = null, teamKey = null; if (tagObject != null) { String tag = tagObject.toString(); if (EventTeamHelper.validateEventTeamKey(tag)) { eventKey = EventTeamHelper.getEventKey(tag); teamKey = EventTeamHelper.getTeamKey(tag); } else if (TeamHelper.validateTeamKey(tag) || TeamHelper.validateMultiTeamKey(tag)) { eventKey = mEventKey; teamKey = tag; } else { TbaLogger.w("EventTeamClickListener received invalid EventTeam Key! " + tag); // Use defaults provided in constructor eventKey = mEventKey; teamKey = mTeamKey; } } else { eventKey = mEventKey; teamKey = mTeamKey; } return new String[]{eventKey, teamKey}; } private String getKeyFromAdapterView(AdapterView adapterView, int position) { if (adapterView.getAdapter() instanceof ListViewAdapter) { ListViewAdapter adapter = (ListViewAdapter) adapterView.getAdapter(); if (adapter.getItem(position) instanceof ListElement) { ListElement element = (ListElement) adapter.getItem(position); return element.getKey(); } } return ""; } private void showViewEventTeamDialog(String eventKey, String teamKey) { final String[] items = new String[]{"View Team@Event", "View Team"}; new AlertDialog.Builder(mContext) .setItems(items, (dialog, which) -> { if (which == 0) { // show team@event mContext.startActivity(TeamAtEventActivity.newInstance(mContext, eventKey, teamKey)); } else { // show team mContext.startActivity(ViewTeamActivity.newInstance(mContext, teamKey)); } }).show(); } }