/** * Copyright 2010 Mark Wyszomierski */ package com.joelapenna.foursquared; import com.joelapenna.foursquare.types.Venue; import com.joelapenna.foursquared.util.VenueUtils; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; import java.util.TreeMap; /** * Queries the system for any apps that can be used for sharing data, * like sms or email. Package exploration is largely taken from Mark * Murphy's commonsware projects: * * http://github.com/commonsguy/cw-advandroid * * @date September 22, 2010 * @author Mark Wyszomierski (markww@gmail.com) * */ public class VenueShareActivity extends Activity { public static final String TAG = "VenueShareActivity"; public static final boolean DEBUG = FoursquaredSettings.DEBUG; public static final String INTENT_EXTRA_VENUE = Foursquared.PACKAGE_NAME + ".VenueShareActivity.INTENT_EXTRA_VENUE"; private StateHolder mStateHolder; private ShareAdapter mListAdapter; private BroadcastReceiver mLoggedOutReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (DEBUG) Log.d(TAG, "onReceive: " + intent); finish(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); registerReceiver(mLoggedOutReceiver, new IntentFilter(Foursquared.INTENT_ACTION_LOGGED_OUT)); setContentView(R.layout.venue_share_activity); setTitle(getString(R.string.venue_share_activity_title)); Object retained = getLastNonConfigurationInstance(); if (retained != null && retained instanceof StateHolder) { mStateHolder = (StateHolder) retained; } else { mStateHolder = new StateHolder(); if (getIntent().hasExtra(INTENT_EXTRA_VENUE)) { mStateHolder.setVenue((Venue)getIntent().getExtras().getParcelable(INTENT_EXTRA_VENUE)); } else { Log.e(TAG, "VenueShareActivity requires a venue parcel its intent extras."); finish(); return; } } ensureUi(); } @Override public void onPause() { super.onPause(); if (isFinishing()) { unregisterReceiver(mLoggedOutReceiver); } } @Override public Object onRetainNonConfigurationInstance() { return mStateHolder; } private void ensureUi() { mListAdapter = new ShareAdapter(this, getPackageManager(), findAppsForSharing()); ListView listView = (ListView)findViewById(R.id.listview); listView.setAdapter(mListAdapter); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { launchAppIntent(position); } }); } private void launchAppIntent(int position) { ResolveInfo launchable = mListAdapter.getItem(position); ActivityInfo activity = launchable.activityInfo; ComponentName componentName = new ComponentName( activity.applicationInfo.packageName, activity.name); Intent intent = new Intent(Intent.ACTION_SEND); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setComponent(componentName); intent.setType("text/plain"); intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Foursquare Venue Share"); intent.putExtra(android.content.Intent.EXTRA_TEXT, VenueUtils.toStringVenueShare(mStateHolder.getVenue())); startActivity(intent); finish(); } private List<ResolveInfo> findAppsForSharing() { Intent intent = new Intent(Intent.ACTION_SEND, null); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setType("text/plain"); List<ResolveInfo> activities = getPackageManager().queryIntentActivities(intent, 0); TreeMap<String, ResolveInfo> alpha = new TreeMap<String, ResolveInfo>(); for (ResolveInfo it : activities) { alpha.put(it.loadLabel(getPackageManager()).toString(), it); } return new ArrayList<ResolveInfo>(alpha.values()); } private class ShareAdapter extends ArrayAdapter<ResolveInfo> { public ShareAdapter(Context context, PackageManager pm, List<ResolveInfo> apps) { super(context, R.layout.user_actions_list_item, apps); } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = newView(parent); } bindView(position, convertView); return(convertView); } private View newView(ViewGroup parent) { return (getLayoutInflater().inflate(R.layout.user_actions_list_item, parent, false)); } private void bindView(int position, View view) { PackageManager packageManager = getPackageManager(); ImageView icon = (ImageView)view.findViewById(R.id.userActionsListItemIcon); icon.setImageDrawable(getItem(position).loadIcon(packageManager)); TextView label = (TextView)view.findViewById(R.id.userActionsListItemLabel); label.setText(getItem(position).loadLabel(packageManager)); } } private static class StateHolder { private Venue mVenue; public StateHolder() { } public Venue getVenue() { return mVenue; } public void setVenue(Venue venue) { mVenue = venue; } } }