/** * Copyright 2009 Joe LaPenna */ package com.joelapenna.foursquared; import com.joelapenna.foursquare.types.Checkin; import com.joelapenna.foursquare.types.Group; import com.joelapenna.foursquare.types.Mayor; import com.joelapenna.foursquare.types.Stats; import com.joelapenna.foursquare.types.Tip; import com.joelapenna.foursquare.types.Todo; import com.joelapenna.foursquare.types.User; import com.joelapenna.foursquare.types.Venue; import com.joelapenna.foursquared.location.LocationUtils; import com.joelapenna.foursquared.preferences.Preferences; import com.joelapenna.foursquared.util.NotificationsUtil; import com.joelapenna.foursquared.util.RemoteResourceManager; import com.joelapenna.foursquared.util.StringFormatters; import com.joelapenna.foursquared.util.UserUtils; import com.joelapenna.foursquared.util.VenueUtils; import com.joelapenna.foursquared.widget.PhotoStrip; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.text.TextUtils; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import java.io.IOException; import java.util.Observable; import java.util.Observer; /** * We may be given a pre-fetched venue ready to display, or we might also get just * a venue ID. If we only get a venue ID, then we need to fetch it immediately from * the API. * * The activity will set an intent result in EXTRA_VENUE_RETURNED if the venue status * changes as a result of a user modifying todos at the venue. Parent activities can * check the returned venue to see if this status has changed to update their UI. * For example, the NearbyVenues activity wants to show the todo corner png if the * venue has a todo. * * The result will also be set if the venue is fully fetched if originally given only * a venue id or partial venue object. This way the parent can also cache the full venue * object for next time they want to display this venue activity. * * @author Joe LaPenna (joe@joelapenna.com) * @author Mark Wyszomierski (markww@gmail.com) * -Replaced shout activity with CheckinGatherInfoActivity (3/10/2010). * -Redesign from tabbed layout (9/15/2010). */ public class VenueActivity extends Activity { private static final String TAG = "VenueActivity"; private static final boolean DEBUG = FoursquaredSettings.DEBUG; private static final int MENU_TIP_ADD = 1; private static final int MENU_TODO_ADD = 2; private static final int MENU_EDIT_VENUE = 3; private static final int MENU_CALL = 4; private static final int MENU_SHARE = 5; private static final int RESULT_CODE_ACTIVITY_CHECKIN_EXECUTE = 1; private static final int RESULT_CODE_ACTIVITY_ADD_TIP = 2; private static final int RESULT_CODE_ACTIVITY_ADD_TODO = 3; private static final int RESULT_CODE_ACTIVITY_TIP = 4; private static final int RESULT_CODE_ACTIVITY_TIPS = 5; private static final int RESULT_CODE_ACTIVITY_TODO = 6; private static final int RESULT_CODE_ACTIVITY_TODOS = 7; public static final String INTENT_EXTRA_VENUE_ID = Foursquared.PACKAGE_NAME + ".VenueActivity.INTENT_EXTRA_VENUE_ID"; public static final String INTENT_EXTRA_VENUE_PARTIAL = Foursquared.PACKAGE_NAME + ".VenueActivity.INTENT_EXTRA_VENUE_PARTIAL"; public static final String INTENT_EXTRA_VENUE = Foursquared.PACKAGE_NAME + ".VenueActivity.INTENT_EXTRA_VENUE"; public static final String EXTRA_VENUE_RETURNED = Foursquared.PACKAGE_NAME + ".VenueActivity.EXTRA_VENUE_RETURNED"; private StateHolder mStateHolder; private Handler mHandler; private RemoteResourceManager mRrm; private RemoteResourceManagerObserver mResourcesObserver; private BroadcastReceiver mLoggedOutReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (DEBUG) Log.d(TAG, "onReceive: " + intent); finish(); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.venue_activity); registerReceiver(mLoggedOutReceiver, new IntentFilter(Foursquared.INTENT_ACTION_LOGGED_OUT)); mHandler = new Handler(); StateHolder holder = (StateHolder) getLastNonConfigurationInstance(); if (holder != null) { mStateHolder = holder; mStateHolder.setActivityForTasks(this); prepareResultIntent(); } else { mStateHolder = new StateHolder(); if (getIntent().hasExtra(INTENT_EXTRA_VENUE)) { mStateHolder.setLoadType(StateHolder.LOAD_TYPE_VENUE_FULL); mStateHolder.setVenue((Venue)getIntent().getParcelableExtra(INTENT_EXTRA_VENUE)); } else if (getIntent().hasExtra(INTENT_EXTRA_VENUE_PARTIAL)) { mStateHolder.setLoadType(StateHolder.LOAD_TYPE_VENUE_PARTIAL); mStateHolder.setVenue((Venue)getIntent().getParcelableExtra(INTENT_EXTRA_VENUE_PARTIAL)); mStateHolder.startTaskVenue(this); } else if (getIntent().hasExtra(INTENT_EXTRA_VENUE_ID)) { mStateHolder.setLoadType(StateHolder.LOAD_TYPE_VENUE_ID); mStateHolder.setVenueId(getIntent().getStringExtra(INTENT_EXTRA_VENUE_ID)); mStateHolder.startTaskVenue(this); } else { Log.e(TAG, "VenueActivity must be given a venue id or a venue parcel as intent extras."); finish(); return; } } mRrm = ((Foursquared) getApplication()).getRemoteResourceManager(); mResourcesObserver = new RemoteResourceManagerObserver(); mRrm.addObserver(mResourcesObserver); ensureUi(); } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mLoggedOutReceiver); mHandler.removeCallbacks(mRunnableMayorPhoto); if (mRrm != null) { mRrm.deleteObserver(mResourcesObserver); } } @Override public void onResume() { super.onResume(); ensureUiCheckinButton(); // TODO: ensure mayor photo. } private void ensureUi() { TextView tvVenueTitle = (TextView)findViewById(R.id.venueActivityName); TextView tvVenueAddress = (TextView)findViewById(R.id.venueActivityAddress); LinearLayout progress = (LinearLayout)findViewById(R.id.venueActivityDetailsProgress); View viewMayor = findViewById(R.id.venueActivityMayor); TextView tvMayorTitle = (TextView)findViewById(R.id.venueActivityMayorName); TextView tvMayorText = (TextView)findViewById(R.id.venueActivityMayorText); ImageView ivMayorPhoto = (ImageView)findViewById(R.id.venueActivityMayorPhoto); ImageView ivMayorChevron = (ImageView)findViewById(R.id.venueActivityMayorChevron); View viewCheckins = findViewById(R.id.venueActivityCheckins); TextView tvPeopleText = (TextView)findViewById(R.id.venueActivityPeopleText); PhotoStrip psPeoplePhotos = (PhotoStrip)findViewById(R.id.venueActivityPeoplePhotos); View viewTips = findViewById(R.id.venueActivityTips); TextView tvTipsText = (TextView)findViewById(R.id.venueActivityTipsText); TextView tvTipsTextExtra = (TextView)findViewById(R.id.venueActivityTipsExtra); ImageView ivTipsChevron = (ImageView)findViewById(R.id.venueActivityTipsChevron); View viewMoreInfo = findViewById(R.id.venueActivityMoreInfo); TextView tvMoreInfoText = (TextView)findViewById(R.id.venueActivityMoreTitle); Venue venue = mStateHolder.getVenue(); if (mStateHolder.getLoadType() == StateHolder.LOAD_TYPE_VENUE_FULL || mStateHolder.getLoadType() == StateHolder.LOAD_TYPE_VENUE_PARTIAL) { tvVenueTitle.setText(venue.getName()); tvVenueAddress.setText(StringFormatters.getVenueLocationFull(venue)); ensureUiCheckinButton(); if (mStateHolder.getLoadType() == StateHolder.LOAD_TYPE_VENUE_FULL) { Stats stats = venue.getStats(); Mayor mayor = stats != null ? stats.getMayor() : null; if (mayor != null) { tvMayorTitle.setText(StringFormatters.getUserFullName(mayor.getUser())); tvMayorText.setText(getResources().getString(R.string.venue_activity_mayor_text)); String photoUrl = mayor.getUser().getPhoto(); Uri uriPhoto = Uri.parse(photoUrl); if (mRrm.exists(uriPhoto)) { try { Bitmap bitmap = BitmapFactory.decodeStream(mRrm.getInputStream(Uri.parse(photoUrl))); ivMayorPhoto.setImageBitmap(bitmap); } catch (IOException e) { } } else { ivMayorPhoto.setImageResource(UserUtils.getDrawableByGenderForUserThumbnail(mayor.getUser())); ivMayorPhoto.setTag(photoUrl); mRrm.request(uriPhoto); } ivMayorChevron.setVisibility(View.VISIBLE); setClickHandlerMayor(viewMayor); } else { tvMayorTitle.setText(getResources().getString(R.string.venue_activity_mayor_name_none)); tvMayorText.setText(getResources().getString(R.string.venue_activity_mayor_text_none)); ivMayorChevron.setVisibility(View.INVISIBLE); } viewMayor.setVisibility(View.VISIBLE); if (venue.getCheckins() != null && venue.getCheckins().size() > 0) { int friendCount = getFriendCountAtVenue(); int rest = venue.getCheckins().size() - friendCount; if (friendCount > 0 && rest == 0) { // N friends are here tvPeopleText.setText(getResources().getString( friendCount == 1 ? R.string.venue_activity_people_count_friend_single : R.string.venue_activity_people_count_friend_plural, friendCount)); } else if (friendCount > 0 && rest > 0) { // N friends are here with N other people if (friendCount == 1 && rest == 1) { tvPeopleText.setText(getString(R.string.venue_activity_people_count_friend_single_single, friendCount, rest)); } else if (friendCount == 1 && rest > 1) { tvPeopleText.setText(getString(R.string.venue_activity_people_count_friend_single_plural, friendCount, rest)); } else if (friendCount > 1 && rest == 1) { tvPeopleText.setText(getString(R.string.venue_activity_people_count_friend_plural_single, friendCount, rest)); } else { tvPeopleText.setText(getString(R.string.venue_activity_people_count_friend_plural_plural, friendCount, rest)); } } else { // N people are here tvPeopleText.setText(getResources().getString( venue.getCheckins().size() == 1 ? R.string.venue_activity_people_count_single : R.string.venue_activity_people_count_plural, venue.getCheckins().size())); } psPeoplePhotos.setCheckinsAndRemoteResourcesManager(venue.getCheckins(), mRrm); viewCheckins.setVisibility(View.VISIBLE); setClickHandlerCheckins(viewCheckins); } else { viewCheckins.setVisibility(View.GONE); } if (venue.getTips() != null && venue.getTips().size() > 0) { int tipCountFriends = getTipCountFriendsAtVenue(); if (tipCountFriends > 0) { tvTipsText.setText( getString(tipCountFriends == 1 ? R.string.venue_activity_tip_count_friend_single : R.string.venue_activity_tip_count_friend_plural, tipCountFriends)); int rest = venue.getTips().size() - tipCountFriends; if (rest > 0) { tvTipsTextExtra.setText( getString(R.string.venue_activity_tip_count_other_people, rest)); tvTipsTextExtra.setVisibility(View.VISIBLE); } } else { tvTipsText.setText( getString(venue.getTips().size() == 1 ? R.string.venue_activity_tip_count_single : R.string.venue_activity_tip_count_plural, venue.getTips().size())); tvTipsTextExtra.setVisibility(View.GONE); } ivTipsChevron.setVisibility(View.VISIBLE); setClickHandlerTips(viewTips); } else { tvTipsText.setText(getResources().getString(R.string.venue_activity_tip_count_none)); tvTipsTextExtra.setVisibility(View.GONE); ivTipsChevron.setVisibility(View.INVISIBLE); } viewTips.setVisibility(View.VISIBLE); if (tvTipsTextExtra.getVisibility() != View.VISIBLE) { tvTipsText.setPadding(tvTipsText.getPaddingLeft(), tvMoreInfoText.getPaddingTop(), tvTipsText.getPaddingRight(), tvMoreInfoText.getPaddingBottom()); } viewMoreInfo.setVisibility(View.VISIBLE); setClickHandlerMoreInfo(viewMoreInfo); progress.setVisibility(View.GONE); } } ensureUiTodosHere(); ImageView ivSpecialHere = (ImageView)findViewById(R.id.venueActivitySpecialHere); if (VenueUtils.getSpecialHere(venue)) { ivSpecialHere.setVisibility(View.VISIBLE); ivSpecialHere.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { showWebViewForSpecial(); } }); } else { ivSpecialHere.setVisibility(View.GONE); } } private void ensureUiCheckinButton() { Button btnCheckin = (Button)findViewById(R.id.venueActivityButtonCheckin); if (mStateHolder.getCheckedInHere()) { btnCheckin.setEnabled(false); } else { if (mStateHolder.getLoadType() == StateHolder.LOAD_TYPE_VENUE_ID) { btnCheckin.setEnabled(false); } else { btnCheckin.setEnabled(true); btnCheckin.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences( VenueActivity.this); if (settings.getBoolean(Preferences.PREFERENCE_IMMEDIATE_CHECKIN, false)) { startCheckinQuick(); } else { startCheckin(); } } }); } } } private void ensureUiTipAdded() { Venue venue = mStateHolder.getVenue(); TextView tvTipsText = (TextView)findViewById(R.id.venueActivityTipsText); ImageView ivTipsChevron = (ImageView)findViewById(R.id.venueActivityTipsChevron); if (venue.getTips().size() == 1) { tvTipsText.setText(getResources().getString( R.string.venue_activity_tip_count_single, venue.getTips().size())); } else { tvTipsText.setText(getResources().getString( R.string.venue_activity_tip_count_plural, venue.getTips().size())); } ivTipsChevron.setVisibility(View.VISIBLE); } private void ensureUiTodosHere() { Venue venue = mStateHolder.getVenue(); RelativeLayout rlTodoHere = (RelativeLayout)findViewById(R.id.venueActivityTodoHere); if (venue != null && venue.getHasTodo()) { rlTodoHere.setVisibility(View.VISIBLE); rlTodoHere.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { showTodoHereActivity(); } }); } else { rlTodoHere.setVisibility(View.GONE); } } private void setClickHandlerMayor(View view) { view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(VenueActivity.this, UserDetailsActivity.class); intent.putExtra(UserDetailsActivity.EXTRA_USER_PARCEL, mStateHolder.getVenue().getStats().getMayor().getUser()); intent.putExtra(UserDetailsActivity.EXTRA_SHOW_ADD_FRIEND_OPTIONS, true); startActivity(intent); } }); } private void setClickHandlerCheckins(View view) { view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(VenueActivity.this, VenueCheckinsActivity.class); intent.putExtra(VenueCheckinsActivity.INTENT_EXTRA_VENUE, mStateHolder.getVenue()); startActivity(intent); } }); } private void setClickHandlerTips(View view) { view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = null; if (mStateHolder.getVenue().getTips().size() == 1) { Venue venue = new Venue(); venue.setName(mStateHolder.getVenue().getName()); venue.setAddress(mStateHolder.getVenue().getAddress()); venue.setCrossstreet(mStateHolder.getVenue().getCrossstreet()); Tip tip = mStateHolder.getVenue().getTips().get(0); tip.setVenue(venue); intent = new Intent(VenueActivity.this, TipActivity.class); intent.putExtra(TipActivity.EXTRA_TIP_PARCEL, tip); intent.putExtra(TipActivity.EXTRA_VENUE_CLICKABLE, false); startActivityForResult(intent, RESULT_CODE_ACTIVITY_TIP); } else { intent = new Intent(VenueActivity.this, VenueTipsActivity.class); intent.putExtra(VenueTipsActivity.INTENT_EXTRA_VENUE, mStateHolder.getVenue()); startActivityForResult(intent, RESULT_CODE_ACTIVITY_TIPS); } } }); } private void setClickHandlerMoreInfo(View view) { view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(VenueActivity.this, VenueMapActivity.class); intent.putExtra(VenueMapActivity.INTENT_EXTRA_VENUE, mStateHolder.getVenue()); startActivity(intent); } }); } private void prepareResultIntent() { Venue venue = mStateHolder.getVenue(); Intent intent = new Intent(); if (venue != null) { intent.putExtra(EXTRA_VENUE_RETURNED, venue); } setResult(Activity.RESULT_OK, intent); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(Menu.NONE, MENU_TIP_ADD, 1, R.string.venue_activity_menu_add_tip).setIcon( R.drawable.ic_menu_venue_leave_tip); menu.add(Menu.NONE, MENU_TODO_ADD, 2, R.string.venue_activity_menu_add_todo).setIcon( R.drawable.ic_menu_venue_add_todo); menu.add(Menu.NONE, MENU_EDIT_VENUE, 3, R.string.venue_activity_menu_flag).setIcon( R.drawable.ic_menu_venue_flag); menu.add(Menu.NONE, MENU_CALL, 4, R.string.venue_activity_menu_call).setIcon( R.drawable.ic_menu_venue_contact); menu.add(Menu.NONE, MENU_SHARE, 5, R.string.venue_activity_menu_share).setIcon( R.drawable.ic_menu_venue_share); return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { boolean callEnabled = mStateHolder.getVenue() != null && !TextUtils.isEmpty(mStateHolder.getVenue().getPhone()); menu.findItem(MENU_CALL).setEnabled(callEnabled); return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_TIP_ADD: Intent intentTip = new Intent(VenueActivity.this, AddTipActivity.class); intentTip.putExtra(AddTipActivity.INTENT_EXTRA_VENUE, mStateHolder.getVenue()); startActivityForResult(intentTip, RESULT_CODE_ACTIVITY_ADD_TIP); return true; case MENU_TODO_ADD: Intent intentTodo = new Intent(VenueActivity.this, AddTodoActivity.class); intentTodo.putExtra(AddTodoActivity.INTENT_EXTRA_VENUE, mStateHolder.getVenue()); startActivityForResult(intentTodo, RESULT_CODE_ACTIVITY_ADD_TODO); return true; case MENU_EDIT_VENUE: Intent intentEditVenue = new Intent(this, EditVenueOptionsActivity.class); intentEditVenue.putExtra( EditVenueOptionsActivity.EXTRA_VENUE_PARCELABLE, mStateHolder.getVenue()); startActivity(intentEditVenue); return true; case MENU_CALL: try { Intent dial = new Intent(); dial.setAction(Intent.ACTION_DIAL); dial.setData(Uri.parse("tel:" + mStateHolder.getVenue().getPhone())); startActivity(dial); } catch (Exception ex) { Log.e(TAG, "Error starting phone dialer intent.", ex); Toast.makeText(this, "Sorry, we couldn't find any app to place a phone call!", Toast.LENGTH_SHORT).show(); } return true; case MENU_SHARE: Intent intentShare = new Intent(this, VenueShareActivity.class); intentShare.putExtra(VenueShareActivity.INTENT_EXTRA_VENUE, mStateHolder.getVenue()); startActivity(intentShare); return true; } return super.onOptionsItemSelected(item); } @Override public Object onRetainNonConfigurationInstance() { mStateHolder.setActivityForTasks(null); return mStateHolder; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case RESULT_CODE_ACTIVITY_CHECKIN_EXECUTE: if (resultCode == Activity.RESULT_OK) { mStateHolder.setCheckedInHere(true); ensureUiCheckinButton(); } break; case RESULT_CODE_ACTIVITY_ADD_TIP: if (resultCode == Activity.RESULT_OK) { Tip tip = data.getParcelableExtra(AddTipActivity.EXTRA_TIP_RETURNED); VenueUtils.addTip(mStateHolder.getVenue(), tip); ensureUiTipAdded(); prepareResultIntent(); Toast.makeText(this, getResources().getString(R.string.venue_activity_tip_added_ok), Toast.LENGTH_SHORT).show(); } break; case RESULT_CODE_ACTIVITY_ADD_TODO: if (resultCode == Activity.RESULT_OK) { Todo todo = data.getParcelableExtra(AddTodoActivity.EXTRA_TODO_RETURNED); VenueUtils.addTodo(mStateHolder.getVenue(), todo.getTip(), todo); ensureUiTodosHere(); prepareResultIntent(); Toast.makeText(this, getResources().getString(R.string.venue_activity_todo_added_ok), Toast.LENGTH_SHORT).show(); } break; case RESULT_CODE_ACTIVITY_TIP: case RESULT_CODE_ACTIVITY_TODO: if (resultCode == Activity.RESULT_OK && data.hasExtra(TipActivity.EXTRA_TIP_RETURNED)) { Tip tip = (Tip)data.getParcelableExtra(TipActivity.EXTRA_TIP_RETURNED); Todo todo = data.hasExtra(TipActivity.EXTRA_TODO_RETURNED) ? (Todo)data.getParcelableExtra(TipActivity.EXTRA_TODO_RETURNED) : null; VenueUtils.handleTipChange(mStateHolder.getVenue(), tip, todo); ensureUiTodosHere(); prepareResultIntent(); } break; case RESULT_CODE_ACTIVITY_TIPS: if (resultCode == Activity.RESULT_OK && data.hasExtra(VenueTipsActivity.INTENT_EXTRA_RETURN_VENUE)) { Venue venue = (Venue)data.getParcelableExtra(VenueTipsActivity.INTENT_EXTRA_RETURN_VENUE); VenueUtils.replaceTipsAndTodos(mStateHolder.getVenue(), venue); ensureUiTodosHere(); prepareResultIntent(); } break; case RESULT_CODE_ACTIVITY_TODOS: if (resultCode == Activity.RESULT_OK && data.hasExtra(VenueTodosActivity.INTENT_EXTRA_RETURN_VENUE)) { Venue venue = (Venue)data.getParcelableExtra(VenueTodosActivity.INTENT_EXTRA_RETURN_VENUE); VenueUtils.replaceTipsAndTodos(mStateHolder.getVenue(), venue); ensureUiTodosHere(); prepareResultIntent(); } break; } } private void startCheckin() { Intent intent = new Intent(this, CheckinOrShoutGatherInfoActivity.class); intent.putExtra(CheckinOrShoutGatherInfoActivity.INTENT_EXTRA_IS_CHECKIN, true); intent.putExtra(CheckinOrShoutGatherInfoActivity.INTENT_EXTRA_VENUE_ID, mStateHolder.getVenue().getId()); intent.putExtra(CheckinOrShoutGatherInfoActivity.INTENT_EXTRA_VENUE_NAME, mStateHolder.getVenue().getName()); startActivityForResult(intent, RESULT_CODE_ACTIVITY_CHECKIN_EXECUTE); } private void startCheckinQuick() { SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); boolean tellFriends = settings.getBoolean(Preferences.PREFERENCE_SHARE_CHECKIN, true); boolean tellTwitter = settings.getBoolean(Preferences.PREFERENCE_TWITTER_CHECKIN, false); boolean tellFacebook = settings.getBoolean(Preferences.PREFERENCE_FACEBOOK_CHECKIN, false); Intent intent = new Intent(VenueActivity.this, CheckinExecuteActivity.class); intent.putExtra(CheckinExecuteActivity.INTENT_EXTRA_VENUE_ID, mStateHolder.getVenue().getId()); intent.putExtra(CheckinExecuteActivity.INTENT_EXTRA_SHOUT, ""); intent.putExtra(CheckinExecuteActivity.INTENT_EXTRA_TELL_FRIENDS, tellFriends); intent.putExtra(CheckinExecuteActivity.INTENT_EXTRA_TELL_TWITTER, tellTwitter); intent.putExtra(CheckinExecuteActivity.INTENT_EXTRA_TELL_FACEBOOK, tellFacebook); startActivityForResult(intent, RESULT_CODE_ACTIVITY_CHECKIN_EXECUTE); } private void showWebViewForSpecial() { Intent intent = new Intent(this, SpecialWebViewActivity.class); intent.putExtra(SpecialWebViewActivity.EXTRA_CREDENTIALS_USERNAME, PreferenceManager.getDefaultSharedPreferences(this).getString(Preferences.PREFERENCE_LOGIN, "")); intent.putExtra(SpecialWebViewActivity.EXTRA_CREDENTIALS_PASSWORD, PreferenceManager.getDefaultSharedPreferences(this).getString(Preferences.PREFERENCE_PASSWORD, "")); intent.putExtra(SpecialWebViewActivity.EXTRA_SPECIAL_ID, mStateHolder.getVenue().getSpecials().get(0).getId()); startActivity(intent); } private void showTodoHereActivity() { Venue venue = new Venue(); venue.setName(mStateHolder.getVenue().getName()); venue.setAddress(mStateHolder.getVenue().getAddress()); venue.setCrossstreet(mStateHolder.getVenue().getCrossstreet()); Group<Todo> todos = mStateHolder.getVenue().getTodos(); for (Todo it : todos) { it.getTip().setVenue(venue); } if (todos.size() == 1) { Todo todo = (Todo) todos.get(0); Intent intent = new Intent(VenueActivity.this, TipActivity.class); intent.putExtra(TipActivity.EXTRA_TIP_PARCEL, todo.getTip()); intent.putExtra(TipActivity.EXTRA_VENUE_CLICKABLE, false); startActivityForResult(intent, RESULT_CODE_ACTIVITY_TODO); } else if (todos.size() > 1) { Intent intent = new Intent(VenueActivity.this, VenueTodosActivity.class); intent.putExtra(VenueTodosActivity.INTENT_EXTRA_VENUE, mStateHolder.getVenue()); startActivityForResult(intent, RESULT_CODE_ACTIVITY_TODOS); } } private int getFriendCountAtVenue() { int count = 0; Venue venue = mStateHolder.getVenue(); if (venue.getCheckins() != null) { for (Checkin it : venue.getCheckins()) { User user = it.getUser(); if (UserUtils.isFriend(user)) { count++; } } } return count; } private int getTipCountFriendsAtVenue() { int count = 0; Venue venue = mStateHolder.getVenue(); if (venue.getTips() != null) { for (Tip it : venue.getTips()) { User user = it.getUser(); if (UserUtils.isFriend(user)) { count++; } } } return count; } private static class TaskVenue extends AsyncTask<String, Void, Venue> { private VenueActivity mActivity; private Exception mReason; public TaskVenue(VenueActivity activity) { mActivity = activity; } @Override protected void onPreExecute() { } @Override protected Venue doInBackground(String... params) { try { Foursquared foursquared = (Foursquared)mActivity.getApplication(); return foursquared.getFoursquare().venue( params[0], LocationUtils.createFoursquareLocation(foursquared.getLastKnownLocation())); } catch (Exception e) { Log.e(TAG, "Error getting venue details.", e); mReason = e; } return null; } @Override protected void onPostExecute(Venue venue) { if (mActivity != null) { mActivity.mStateHolder.setIsRunningTaskVenue(false); if (venue != null) { mActivity.mStateHolder.setLoadType(StateHolder.LOAD_TYPE_VENUE_FULL); mActivity.mStateHolder.setVenue(venue); mActivity.prepareResultIntent(); mActivity.ensureUi(); } else { NotificationsUtil.ToastReasonForFailure(mActivity, mReason); mActivity.finish(); } } } @Override protected void onCancelled() { } public void setActivity(VenueActivity activity) { mActivity = activity; } } private static final class StateHolder { private Venue mVenue; private String mVenueId; private boolean mCheckedInHere; private TaskVenue mTaskVenue; private boolean mIsRunningTaskVenue; private int mLoadType; public static final int LOAD_TYPE_VENUE_ID = 0; public static final int LOAD_TYPE_VENUE_PARTIAL = 1; public static final int LOAD_TYPE_VENUE_FULL = 2; public StateHolder() { mIsRunningTaskVenue = false; } public Venue getVenue() { return mVenue; } public void setVenue(Venue venue) { mVenue = venue; } public void setVenueId(String venueId) { mVenueId = venueId; } public boolean getCheckedInHere() { return mCheckedInHere; } public void setCheckedInHere(boolean checkedInHere) { mCheckedInHere = checkedInHere; } public void setIsRunningTaskVenue(boolean isRunningTaskVenue) { mIsRunningTaskVenue = isRunningTaskVenue; } public void startTaskVenue(VenueActivity activity) { if (!mIsRunningTaskVenue) { mIsRunningTaskVenue = true; mTaskVenue = new TaskVenue(activity); if (mLoadType == LOAD_TYPE_VENUE_ID) { mTaskVenue.execute(mVenueId); } else if (mLoadType == LOAD_TYPE_VENUE_PARTIAL) { mTaskVenue.execute(mVenue.getId()); } } } public void setActivityForTasks(VenueActivity activity) { if (mTaskVenue != null) { mTaskVenue.setActivity(activity); } } public int getLoadType() { return mLoadType; } public void setLoadType(int loadType) { mLoadType = loadType; } } /** * Handles population of the mayor photo. The strip of checkin photos has its own * internal observer. */ private class RemoteResourceManagerObserver implements Observer { @Override public void update(Observable observable, Object data) { mHandler.post(mRunnableMayorPhoto); } } private Runnable mRunnableMayorPhoto = new Runnable() { @Override public void run() { ImageView ivMayorPhoto = (ImageView)findViewById(R.id.venueActivityMayorPhoto); if (ivMayorPhoto.getTag() != null) { String mayorPhotoUrl = (String)ivMayorPhoto.getTag(); try { Bitmap bitmap = BitmapFactory.decodeStream(mRrm.getInputStream(Uri.parse(mayorPhotoUrl))); ivMayorPhoto.setImageBitmap(bitmap); ivMayorPhoto.setTag(null); ivMayorPhoto.invalidate(); } catch (IOException ex) { Log.e(TAG, "Error decoding mayor photo on notification, ignoring.", ex); } } } }; }