Merge "Launch viewStreamItemPhotoActivity when photo is tapped..."
diff --git a/src/com/android/contacts/detail/ContactDetailDisplayUtils.java b/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
index cbdf148..18a4750 100644
--- a/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
+++ b/src/com/android/contacts/detail/ContactDetailDisplayUtils.java
@@ -20,13 +20,13 @@
import com.android.contacts.ContactLoader.Result;
import com.android.contacts.ContactPhotoManager;
import com.android.contacts.R;
-import com.android.contacts.format.FormatUtils;
import com.android.contacts.preference.ContactsPreferences;
import com.android.contacts.util.ContactBadgeUtil;
import com.android.contacts.util.StreamItemEntry;
import com.android.contacts.util.StreamItemPhotoEntry;
import com.google.common.annotations.VisibleForTesting;
+import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.content.Entity;
@@ -37,16 +37,15 @@
import android.content.res.Resources.NotFoundException;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Organization;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.DisplayNameSources;
+import android.provider.ContactsContract.StreamItems;
import android.text.Html;
import android.text.Html.ImageGetter;
-import android.text.Spanned;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
@@ -71,6 +70,27 @@
private static final int PHOTO_FADE_IN_ANIMATION_DURATION_MILLIS = 100;
+ /**
+ * Tag object used for stream item photos.
+ */
+ public static class StreamPhotoTag {
+ public final StreamItemEntry streamItem;
+ public final StreamItemPhotoEntry streamItemPhoto;
+
+ public StreamPhotoTag(StreamItemEntry streamItem, StreamItemPhotoEntry streamItemPhoto) {
+ this.streamItem = streamItem;
+ this.streamItemPhoto = streamItemPhoto;
+ }
+
+ public Uri getStreamItemPhotoUri() {
+ final Uri.Builder builder = StreamItems.CONTENT_URI.buildUpon();
+ ContentUris.appendId(builder, streamItem.getId());
+ builder.appendPath(StreamItems.StreamItemPhotos.CONTENT_DIRECTORY);
+ ContentUris.appendId(builder, streamItemPhoto.getId());
+ return builder.build();
+ }
+ }
+
private ContactDetailDisplayUtils() {
// Disallow explicit creation of this class.
}
@@ -244,7 +264,8 @@
/** Creates the view that represents a stream item. */
public static View createStreamItemView(LayoutInflater inflater, Context context,
- StreamItemEntry streamItem, LinearLayout parent) {
+ StreamItemEntry streamItem, LinearLayout parent,
+ View.OnClickListener photoClickListener) {
View container = inflater.inflate(R.layout.stream_item_container, parent, false);
ViewGroup contentTable = (ViewGroup) container.findViewById(R.id.stream_item_content);
@@ -261,17 +282,17 @@
View photoContainer = inflater.inflate(R.layout.stream_item_row_two_images,
contentTable, false);
- loadPhoto(contactPhotoManager, firstPhoto, photoContainer,
- R.id.stream_item_first_image);
- loadPhoto(contactPhotoManager, secondPhoto, photoContainer,
- R.id.stream_item_second_image);
+ loadPhoto(contactPhotoManager, streamItem, firstPhoto, photoContainer,
+ R.id.stream_item_first_image, photoClickListener);
+ loadPhoto(contactPhotoManager, streamItem, secondPhoto, photoContainer,
+ R.id.stream_item_second_image, photoClickListener);
contentTable.addView(photoContainer);
} else {
// Put in a single photo with text on the side.
View photoContainer = inflater.inflate(
R.layout.stream_item_row_image_and_text, contentTable, false);
- loadPhoto(contactPhotoManager, firstPhoto, photoContainer,
- R.id.stream_item_first_image);
+ loadPhoto(contactPhotoManager, streamItem, firstPhoto, photoContainer,
+ R.id.stream_item_first_image, photoClickListener);
addStreamItemText(context, streamItem,
photoContainer.findViewById(R.id.stream_item_second_text));
contentTable.addView(photoContainer);
@@ -294,11 +315,22 @@
return container;
}
- /** Loads a photo into an image view. The image view is identifiedc by the given id. */
+ /** Loads a photo into an image view. The image view is identified by the given id. */
private static void loadPhoto(ContactPhotoManager contactPhotoManager,
- final StreamItemPhotoEntry firstPhoto, View photoContainer, int imageViewId) {
- ImageView firstImageView = (ImageView) photoContainer.findViewById(imageViewId);
- contactPhotoManager.loadPhoto(firstImageView, Uri.parse(firstPhoto.getPhotoUri()));
+ final StreamItemEntry streamItem, final StreamItemPhotoEntry streamItemPhoto,
+ View photoContainer, int imageViewId, View.OnClickListener photoClickListener) {
+ ImageView imageView = (ImageView) photoContainer.findViewById(imageViewId);
+ if (photoClickListener != null) {
+ imageView.setOnClickListener(photoClickListener);
+ imageView.setTag(new StreamPhotoTag(streamItem, streamItemPhoto));
+ imageView.setFocusable(true);
+ } else {
+ imageView.setOnClickListener(null);
+ imageView.setTag(null);
+ imageView.setFocusable(false);
+ imageView.setClickable(false); // setOnClickListener makes it clickable, so overwrite it
+ }
+ contactPhotoManager.loadPhoto(imageView, Uri.parse(streamItemPhoto.getPhotoUri()));
}
@VisibleForTesting
diff --git a/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java b/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java
index 846a957..99766f2 100644
--- a/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailUpdatesFragment.java
@@ -19,9 +19,11 @@
import com.android.contacts.ContactLoader;
import com.android.contacts.R;
import com.android.contacts.activities.ContactDetailActivity.FragmentKeyListener;
+import com.android.contacts.detail.ContactDetailDisplayUtils.StreamPhotoTag;
import com.android.contacts.model.AccountType;
import com.android.contacts.model.AccountTypeManager;
import com.android.contacts.util.StreamItemEntry;
+import com.android.contacts.util.StreamItemPhotoEntry;
import android.app.ListFragment;
import android.content.ContentUris;
@@ -67,7 +69,7 @@
* <p>
* It assumes the view has a tag of type {@link StreamItemEntry} associated with it.
*/
- private View.OnClickListener mStreamItemClickListener = new View.OnClickListener() {
+ private final View.OnClickListener mStreamItemClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
StreamItemEntry streamItemEntry = (StreamItemEntry) view.getTag();
@@ -75,9 +77,7 @@
// Ignore if this item does not have a stream item associated with it.
return;
}
- final AccountTypeManager manager = AccountTypeManager.getInstance(getActivity());
- final AccountType accountType = manager.getAccountType(
- streamItemEntry.getAccountType(), streamItemEntry.getDataSet());
+ final AccountType accountType = getAccountTypeForStreamItemEntry(streamItemEntry);
final Uri uri = ContentUris.withAppendedId(StreamItems.CONTENT_URI,
streamItemEntry.getId());
@@ -88,6 +88,28 @@
}
};
+ private final View.OnClickListener mStreamItemPhotoItemClickListener
+ = new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ StreamPhotoTag tag = (StreamPhotoTag) view.getTag();
+ if (tag == null) {
+ return;
+ }
+ final AccountType accountType = getAccountTypeForStreamItemEntry(tag.streamItem);
+
+ final Intent intent = new Intent(Intent.ACTION_VIEW, tag.getStreamItemPhotoUri());
+ intent.setClassName(accountType.resPackageName,
+ accountType.getViewStreamItemPhotoActivity());
+ startActivity(intent);
+ }
+ };
+
+ private AccountType getAccountTypeForStreamItemEntry(StreamItemEntry streamItemEntry) {
+ return AccountTypeManager.getInstance(getActivity()).getAccountType(
+ streamItemEntry.getAccountType(), streamItemEntry.getDataSet());
+ }
+
public ContactDetailUpdatesFragment() {
// Explicit constructor for inflation
}
@@ -108,7 +130,8 @@
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
- mStreamItemAdapter = new StreamItemAdapter(getActivity(), mStreamItemClickListener);
+ mStreamItemAdapter = new StreamItemAdapter(getActivity(), mStreamItemClickListener,
+ mStreamItemPhotoItemClickListener);
setListAdapter(mStreamItemAdapter);
getListView().setOnScrollListener(mVerticalScrollListener);
diff --git a/src/com/android/contacts/detail/StreamItemAdapter.java b/src/com/android/contacts/detail/StreamItemAdapter.java
index 5128787..9094c5c 100644
--- a/src/com/android/contacts/detail/StreamItemAdapter.java
+++ b/src/com/android/contacts/detail/StreamItemAdapter.java
@@ -42,14 +42,17 @@
private static final int ITEM_VIEW_TYPE_STREAM_ITEM = 2;
private final Context mContext;
- private final View.OnClickListener mListener;
+ private final View.OnClickListener mItemClickListener;
+ private final View.OnClickListener mPhotoClickListener;
private final LayoutInflater mInflater;
private List<StreamItemEntry> mStreamItems;
- public StreamItemAdapter(Context context, View.OnClickListener listener) {
+ public StreamItemAdapter(Context context, View.OnClickListener itemClickListener,
+ View.OnClickListener photoClickListener) {
mContext = context;
- mListener = listener;
+ mItemClickListener = itemClickListener;
+ mPhotoClickListener = photoClickListener;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mStreamItems = Lists.newArrayList();
}
@@ -83,20 +86,23 @@
if (position == 1) {
return mInflater.inflate(R.layout.updates_title, null);
}
- StreamItemEntry streamItem = (StreamItemEntry) getItem(position);
- View view = ContactDetailDisplayUtils.createStreamItemView(
- mInflater, mContext, streamItem, null);
+ final StreamItemEntry streamItem = (StreamItemEntry) getItem(position);
final AccountTypeManager manager = AccountTypeManager.getInstance(mContext);
final AccountType accountType =
manager.getAccountType(streamItem.getAccountType(), streamItem.getDataSet());
+ final View view = ContactDetailDisplayUtils.createStreamItemView(
+ mInflater, mContext, streamItem, null,
+ (accountType.getViewStreamItemPhotoActivity() == null) ? null : mPhotoClickListener
+ );
if (accountType.getViewStreamItemActivity() != null) {
view.setTag(streamItem);
view.setFocusable(true);
- view.setOnClickListener(mListener);
+ view.setOnClickListener(mItemClickListener);
} else {
view.setTag(null);
view.setFocusable(false);
view.setOnClickListener(null);
+ view.setClickable(false); // setOnClickListener makes it clickable, so overwrite it
}
return view;
}
diff --git a/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java b/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java
index d862d6e..1fee9b6 100644
--- a/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java
+++ b/tests/src/com/android/contacts/detail/StreamItemAdapterTest.java
@@ -28,19 +28,22 @@
// TODO: We should have tests for action, but that requires a mock sync-adapter that specifies
// an action or doesn't
+// TODO Add test for photo click
+
/**
* Unit tests for {@link StreamItemAdapter}.
*/
public class StreamItemAdapterTest extends AndroidTestCase {
private StreamItemAdapter mAdapter;
private FakeOnClickListener mListener;
+ private FakeOnClickListener mPhotoListener;
private View mView;
@Override
protected void setUp() throws Exception {
super.setUp();
mListener = new FakeOnClickListener();
- mAdapter = new StreamItemAdapter(getContext(), mListener);
+ mAdapter = new StreamItemAdapter(getContext(), mListener, mPhotoListener);
}
@Override