summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTaesu Lee <taesu82.lee@samsung.com>2020-01-30 14:56:25 +0900
committerLuca Stefani <luca.stefani.ge1@gmail.com>2020-03-16 16:29:45 +0100
commit945b3581c43971caa316531de980eb16698bf0f8 (patch)
tree990defabf1cc46b2f9875708f0a6107a98eecc36
parentcb8979e038d1c74339a2d05eeec19b91acff20d9 (diff)
downloadpackages_apps_Messaging-945b3581c43971caa316531de980eb16698bf0f8.tar.gz
packages_apps_Messaging-945b3581c43971caa316531de980eb16698bf0f8.tar.bz2
packages_apps_Messaging-945b3581c43971caa316531de980eb16698bf0f8.zip
Support audio attachments through GalleryMediaChooser
GalleryMediaChooser supports audio types also. It displays simple audio icon and file info for audio files on grid views. Test: Manual Change-Id: I98b605156af3c1909c0141a2b99380b5da11c1e2 Signed-off-by: Taesu Lee <taesu82.lee@samsung.com>
-rw-r--r--res/layout/gallery_grid_item_view.xml66
-rw-r--r--res/values/dimens.xml1
-rw-r--r--src/com/android/messaging/datamodel/GalleryBoundCursorLoader.java6
-rw-r--r--src/com/android/messaging/datamodel/data/GalleryGridItemData.java82
-rw-r--r--src/com/android/messaging/datamodel/data/MessagePartData.java7
-rw-r--r--src/com/android/messaging/ui/mediapicker/DocumentImagePicker.java2
-rw-r--r--src/com/android/messaging/ui/mediapicker/GalleryGridItemView.java87
-rw-r--r--src/com/android/messaging/ui/mediapicker/GalleryMediaChooser.java6
-rw-r--r--tests/src/com/android/messaging/ui/mediapicker/GalleryGridItemViewTest.java2
9 files changed, 188 insertions, 71 deletions
diff --git a/res/layout/gallery_grid_item_view.xml b/res/layout/gallery_grid_item_view.xml
index f474a6b..fc857ca 100644
--- a/res/layout/gallery_grid_item_view.xml
+++ b/res/layout/gallery_grid_item_view.xml
@@ -21,12 +21,67 @@
android:background="@color/gallery_image_default_background"
android:clickable="true">
+ <!-- Thumbnail for image and video contents. -->
<com.android.messaging.ui.AsyncImageView
- android:id="@+id/image"
+ android:id="@+id/thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop" />
+ <!-- Additional info such as icon, name and etc. -->
+ <RelativeLayout
+ android:id="@+id/additional_info"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_gravity="center"
+ android:orientation="vertical"
+ android:visibility="gone" >
+
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_above="@id/file_info" >
+ <ImageView
+ android:id="@+id/icon"
+ android:layout_width="@dimen/gallery_icon_size"
+ android:layout_height="@dimen/gallery_icon_size"
+ android:layout_gravity="center"
+ android:scaleType="fitCenter"
+ android:background="@color/background_item_transparent"
+ android:visibility="gone" />
+ </FrameLayout>
+
+ <!-- File info for audio contents only -->
+ <LinearLayout
+ android:id="@+id/file_info"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_alignParentBottom="true"
+ android:layout_marginBottom="4dp"
+ android:paddingLeft="4dp"
+ android:paddingRight="4dp"
+ android:orientation="vertical"
+ android:visibility="gone" >
+
+ <TextView
+ android:id="@+id/file_name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:textAppearance="@android:style/TextAppearance.Material.Subhead" />
+
+ <TextView
+ android:id="@+id/file_type"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:gravity="right"
+ android:textAppearance="@android:style/TextAppearance.Material.Caption" />
+ </LinearLayout>
+ </RelativeLayout>
+
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -44,13 +99,4 @@
android:visibility="gone"
android:contentDescription="@string/gallery_checkbox_content_description" />
- <!-- Play button image for video contents only -->
- <ImageView
- android:id="@+id/video_thumbnail_play_button"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:background="@color/background_item_transparent"
- android:src="@drawable/ic_video_play_light"
- android:visibility="gone" />
</com.android.messaging.ui.mediapicker.GalleryGridItemView>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 4934865..ea4c70a 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -84,6 +84,7 @@
<!-- Flings faster than this length / sec will go from fullscreen straight to closed -->
<dimen name="mediapicker_big_fling_threshold">1000dp</dimen>
<dimen name="gallery_image_cell_size">110dp</dimen>
+ <dimen name="gallery_icon_size">40dp</dimen>
<dimen name="single_attachment_min_dimen">50dp</dimen>
<dimen name="single_attachment_max_height">150dp</dimen>
<dimen name="multiple_attachment_preview_height">130dp</dimen>
diff --git a/src/com/android/messaging/datamodel/GalleryBoundCursorLoader.java b/src/com/android/messaging/datamodel/GalleryBoundCursorLoader.java
index a820ac1..1974a5e 100644
--- a/src/com/android/messaging/datamodel/GalleryBoundCursorLoader.java
+++ b/src/com/android/messaging/datamodel/GalleryBoundCursorLoader.java
@@ -35,7 +35,11 @@ public class GalleryBoundCursorLoader extends BoundCursorLoader {
private static final String SORT_ORDER = MediaColumns.DATE_MODIFIED + " DESC";
private static final String SELECTION = createSelection(
MessagePartData.ACCEPTABLE_GALLERY_MEDIA_TYPES,
- new Integer[] {FileColumns.MEDIA_TYPE_IMAGE, FileColumns.MEDIA_TYPE_VIDEO});
+ new Integer[] {
+ FileColumns.MEDIA_TYPE_IMAGE,
+ FileColumns.MEDIA_TYPE_VIDEO,
+ FileColumns.MEDIA_TYPE_AUDIO
+ });
public GalleryBoundCursorLoader(final String bindingId, final Context context) {
super(bindingId, context, STORAGE_URI, GalleryGridItemData.MEDIA_PROJECTION, SELECTION,
diff --git a/src/com/android/messaging/datamodel/data/GalleryGridItemData.java b/src/com/android/messaging/datamodel/data/GalleryGridItemData.java
index 1536897..941d38d 100644
--- a/src/com/android/messaging/datamodel/data/GalleryGridItemData.java
+++ b/src/com/android/messaging/datamodel/data/GalleryGridItemData.java
@@ -29,6 +29,7 @@ import com.android.messaging.datamodel.media.UriImageRequestDescriptor;
import com.android.messaging.datamodel.media.VideoThumbnailRequestDescriptor;
import com.android.messaging.util.Assert;
import com.android.messaging.util.ContentType;
+import com.android.messaging.util.UriUtil;
/**
* Provides data for GalleryGridItemView
@@ -40,7 +41,8 @@ public class GalleryGridItemData {
MediaColumns.WIDTH,
MediaColumns.HEIGHT,
MediaColumns.MIME_TYPE,
- MediaColumns.DATE_MODIFIED};
+ MediaColumns.DATE_MODIFIED,
+ MediaColumns.DISPLAY_NAME};
public static final String[] SPECIAL_ITEM_COLUMNS = new String[] {
BaseColumns._ID
@@ -54,6 +56,7 @@ public class GalleryGridItemData {
private static final int INDEX_HEIGHT = 3;
private static final int INDEX_MIME_TYPE = 4;
private static final int INDEX_DATE_MODIFIED = 5;
+ private static final int INDEX_DISPLAY_NAME = 6;
/** A special item's id for picking a media from document picker */
public static final String ID_DOCUMENT_PICKER_ITEM = "-1";
@@ -62,6 +65,8 @@ public class GalleryGridItemData {
private String mContentType;
private boolean mIsDocumentPickerItem;
private long mDateSeconds;
+ private String mFileName;
+ private Uri mAudioUri;
public GalleryGridItemData() {
}
@@ -73,37 +78,44 @@ public class GalleryGridItemData {
mImageData = null;
mContentType = null;
} else {
- int sourceWidth = cursor.getInt(INDEX_WIDTH);
- int sourceHeight = cursor.getInt(INDEX_HEIGHT);
-
- // Guard against bad data
- if (sourceWidth <= 0) {
- sourceWidth = ImageRequest.UNSPECIFIED_SIZE;
- }
- if (sourceHeight <= 0) {
- sourceHeight = ImageRequest.UNSPECIFIED_SIZE;
- }
-
mContentType = cursor.getString(INDEX_MIME_TYPE);
+ final String filePath = cursor.getString(INDEX_DATA_PATH);
final String dateModified = cursor.getString(INDEX_DATE_MODIFIED);
mDateSeconds = !TextUtils.isEmpty(dateModified) ? Long.parseLong(dateModified) : -1;
- if (ContentType.isVideoType(mContentType)) {
- mImageData = new VideoThumbnailRequestDescriptor(
- cursor.getLong(INDEX_ID),
- desiredWidth,
- desiredHeight,
- sourceWidth,
- sourceHeight);
- } else {
- mImageData = new FileImageRequestDescriptor(
- cursor.getString(INDEX_DATA_PATH),
- desiredWidth,
- desiredHeight,
- sourceWidth,
- sourceHeight,
- true /* canUseThumbnail */,
- true /* allowCompression */,
- true /* isStatic */);
+ if (ContentType.isAudioType(mContentType)) {
+ mImageData = null;
+ mAudioUri = UriUtil.getUriForResourceFile(filePath);
+ mFileName = cursor.getString(INDEX_DISPLAY_NAME);
+ } else { // For image and video types
+ int sourceWidth = cursor.getInt(INDEX_WIDTH);
+ int sourceHeight = cursor.getInt(INDEX_HEIGHT);
+
+ // Guard against bad data
+ if (sourceWidth <= 0) {
+ sourceWidth = ImageRequest.UNSPECIFIED_SIZE;
+ }
+ if (sourceHeight <= 0) {
+ sourceHeight = ImageRequest.UNSPECIFIED_SIZE;
+ }
+
+ if (ContentType.isVideoType(mContentType)) {
+ mImageData = new VideoThumbnailRequestDescriptor(
+ cursor.getLong(INDEX_ID),
+ desiredWidth,
+ desiredHeight,
+ sourceWidth,
+ sourceHeight);
+ } else {
+ mImageData = new FileImageRequestDescriptor(
+ filePath,
+ desiredWidth,
+ desiredHeight,
+ sourceWidth,
+ sourceHeight,
+ true /* canUseThumbnail */,
+ true /* allowCompression */,
+ true /* isStatic */);
+ }
}
}
}
@@ -113,7 +125,7 @@ public class GalleryGridItemData {
}
public Uri getImageUri() {
- return mImageData.uri;
+ return ContentType.isAudioType(mContentType) ? mAudioUri : mImageData.uri;
}
public UriImageRequestDescriptor getImageRequestDescriptor() {
@@ -122,8 +134,10 @@ public class GalleryGridItemData {
public MessagePartData constructMessagePartData(final Rect startRect) {
Assert.isTrue(!mIsDocumentPickerItem);
- return new MediaPickerMessagePartData(startRect, mContentType,
- mImageData.uri, mImageData.sourceWidth, mImageData.sourceHeight);
+ return ContentType.isAudioType(mContentType)
+ ? new MediaPickerMessagePartData(startRect, mContentType, mAudioUri, 0, 0)
+ : new MediaPickerMessagePartData(startRect, mContentType, mImageData.uri,
+ mImageData.sourceWidth, mImageData.sourceHeight);
}
/**
@@ -136,4 +150,8 @@ public class GalleryGridItemData {
public String getContentType() {
return mContentType;
}
+
+ public String getFileName() {
+ return mFileName;
+ }
}
diff --git a/src/com/android/messaging/datamodel/data/MessagePartData.java b/src/com/android/messaging/datamodel/data/MessagePartData.java
index 42d502a..ea24876 100644
--- a/src/com/android/messaging/datamodel/data/MessagePartData.java
+++ b/src/com/android/messaging/datamodel/data/MessagePartData.java
@@ -61,7 +61,12 @@ public class MessagePartData implements Parcelable {
// Acceptable video types
ContentType.VIDEO_3GP, ContentType.VIDEO_3GPP, ContentType.VIDEO_3G2,
ContentType.VIDEO_H263, ContentType.VIDEO_M4V, ContentType.VIDEO_MP4,
- ContentType.VIDEO_MPEG, ContentType.VIDEO_MPEG4, ContentType.VIDEO_WEBM
+ ContentType.VIDEO_MPEG, ContentType.VIDEO_MPEG4, ContentType.VIDEO_WEBM,
+ // Acceptable audio types
+ ContentType.AUDIO_MP3, ContentType.AUDIO_MP4, ContentType.AUDIO_MIDI,
+ ContentType.AUDIO_MID, ContentType.AUDIO_AMR, ContentType.AUDIO_X_WAV,
+ ContentType.AUDIO_AAC, ContentType.AUDIO_X_MIDI, ContentType.AUDIO_X_MID,
+ ContentType.AUDIO_X_MP3
};
private static final String[] sProjection = {
diff --git a/src/com/android/messaging/ui/mediapicker/DocumentImagePicker.java b/src/com/android/messaging/ui/mediapicker/DocumentImagePicker.java
index 1e52dc4..d6de128 100644
--- a/src/com/android/messaging/ui/mediapicker/DocumentImagePicker.java
+++ b/src/com/android/messaging/ui/mediapicker/DocumentImagePicker.java
@@ -30,7 +30,7 @@ import com.android.messaging.util.ImageUtils;
import com.android.messaging.util.SafeAsyncTask;
/**
- * Wraps around the functionalities to allow the user to pick an image/video from the document
+ * Wraps around the functionalities to allow the user to pick an image/video/audio from the document
* picker. Instances of this class must be tied to a Fragment which is able to delegate activity
* result callbacks.
*/
diff --git a/src/com/android/messaging/ui/mediapicker/GalleryGridItemView.java b/src/com/android/messaging/ui/mediapicker/GalleryGridItemView.java
index 4337d5e..48eaa5d 100644
--- a/src/com/android/messaging/ui/mediapicker/GalleryGridItemView.java
+++ b/src/com/android/messaging/ui/mediapicker/GalleryGridItemView.java
@@ -17,6 +17,7 @@ package com.android.messaging.ui.mediapicker;
import android.content.Context;
import android.database.Cursor;
+import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
@@ -25,6 +26,9 @@ import android.view.View;
import android.widget.CheckBox;
import android.widget.FrameLayout;
import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
import com.android.messaging.R;
import com.android.messaging.datamodel.DataModel;
@@ -54,6 +58,11 @@ public class GalleryGridItemView extends FrameLayout {
GalleryGridItemData mData;
private AsyncImageView mImageView;
private CheckBox mCheckBox;
+ private RelativeLayout mAdditionalInfo;
+ private ImageView mIcon;
+ private LinearLayout mFileInfo;
+ private TextView mFileName;
+ private TextView mFileType;
private HostInterface mHostInterface;
private final OnClickListener mOnClickListener = new OnClickListener() {
@Override
@@ -70,9 +79,14 @@ public class GalleryGridItemView extends FrameLayout {
@Override
protected void onFinishInflate() {
super.onFinishInflate();
- mImageView = (AsyncImageView) findViewById(R.id.image);
+ mImageView = (AsyncImageView) findViewById(R.id.thumbnail);
mCheckBox = (CheckBox) findViewById(R.id.checkbox);
mCheckBox.setOnClickListener(mOnClickListener);
+ mAdditionalInfo = (RelativeLayout) findViewById(R.id.additional_info);
+ mIcon = (ImageView) findViewById(R.id.icon);
+ mFileInfo = (LinearLayout) findViewById(R.id.file_info);
+ mFileName = (TextView) findViewById(R.id.file_name);
+ mFileType = (TextView) findViewById(R.id.file_type);
setOnClickListener(mOnClickListener);
final OnLongClickListener longClickListener = new OnLongClickListener() {
@Override
@@ -136,32 +150,59 @@ public class GalleryGridItemView extends FrameLayout {
}
private void updateImageView() {
- ImageView playButton = (ImageView) findViewById(R.id.video_thumbnail_play_button);
if (mData.isDocumentPickerItem()) {
- mImageView.setScaleType(ImageView.ScaleType.CENTER);
setBackgroundColor(ConversationDrawables.get().getConversationThemeColor());
- mImageView.setImageResourceId(null);
- mImageView.setImageResource(R.drawable.ic_photo_library_light);
- playButton.setVisibility(GONE);
- mImageView.setContentDescription(getResources().getString(
- R.string.pick_image_from_document_library_content_description));
+ mIcon.setImageResource(R.drawable.ic_photo_library_light);
+ mIcon.clearColorFilter();
+ mImageView.setVisibility(GONE);
+ mIcon.setVisibility(VISIBLE);
+ mFileInfo.setVisibility(GONE);
+ mAdditionalInfo.setVisibility(VISIBLE);
} else {
- mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
- setBackgroundColor(getResources().getColor(R.color.gallery_image_default_background));
- mImageView.setImageResourceId(mData.getImageRequestDescriptor());
- if (ContentType.isVideoType(mData.getContentType())) {
- playButton.setVisibility(VISIBLE);
- } else {
- playButton.setVisibility(GONE);
+ final String contentType = mData.getContentType();
+ if (ContentType.isAudioType(contentType)) {
+ final Context context = getContext();
+ setBackgroundColor(
+ getResources().getColor(R.color.gallery_image_default_background));
+ mIcon.setImageDrawable(
+ context.getContentResolver()
+ .getTypeInfo(contentType)
+ .getIcon()
+ .loadDrawable(context));
+ mIcon.setColorFilter(
+ ConversationDrawables.get().getConversationThemeColor(),
+ PorterDuff.Mode.SRC_IN);
+ mFileName.setText(mData.getFileName());
+ String[] type = contentType.split("/");
+ mFileType.setText(type[1].toUpperCase() + " " + type[0]);
+ mImageView.setVisibility(GONE);
+ mIcon.setVisibility(VISIBLE);
+ mFileInfo.setVisibility(VISIBLE);
+ mAdditionalInfo.setVisibility(VISIBLE);
+ } else { // For image and video types
+ mImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
+ setBackgroundColor(
+ getResources().getColor(R.color.gallery_image_default_background));
+ mImageView.setImageResourceId(mData.getImageRequestDescriptor());
+ mImageView.setVisibility(VISIBLE);
+ if (ContentType.isVideoType(mData.getContentType())) {
+ mIcon.setImageResource(R.drawable.ic_video_play_light);
+ mIcon.clearColorFilter();
+ mIcon.setVisibility(VISIBLE);
+ } else {
+ mIcon.setVisibility(GONE);
+ }
+ mFileInfo.setVisibility(GONE);
+ mAdditionalInfo.setVisibility(VISIBLE);
+ final long dateSeconds = mData.getDateSeconds();
+ final boolean isValidDate = (dateSeconds > 0);
+ final int templateId = isValidDate ?
+ R.string.mediapicker_gallery_image_item_description :
+ R.string.mediapicker_gallery_image_item_description_no_date;
+ String contentDescription = String.format(getResources().getString(templateId),
+ dateSeconds * TimeUnit.SECONDS.toMillis(1));
+ mImageView.setContentDescription(contentDescription);
}
- final long dateSeconds = mData.getDateSeconds();
- final boolean isValidDate = (dateSeconds > 0);
- final int templateId = isValidDate ?
- R.string.mediapicker_gallery_image_item_description :
- R.string.mediapicker_gallery_image_item_description_no_date;
- String contentDescription = String.format(getResources().getString(templateId),
- dateSeconds * TimeUnit.SECONDS.toMillis(1));
- mImageView.setContentDescription(contentDescription);
}
}
}
diff --git a/src/com/android/messaging/ui/mediapicker/GalleryMediaChooser.java b/src/com/android/messaging/ui/mediapicker/GalleryMediaChooser.java
index 8db13db..c9b544d 100644
--- a/src/com/android/messaging/ui/mediapicker/GalleryMediaChooser.java
+++ b/src/com/android/messaging/ui/mediapicker/GalleryMediaChooser.java
@@ -39,7 +39,7 @@ import com.android.messaging.util.Assert;
import com.android.messaging.util.OsUtil;
/**
- * Chooser which allows the user to select one or more existing images or videos
+ * Chooser which allows the user to select one or more existing images or videos or audios.
*/
class GalleryMediaChooser extends MediaChooser implements
GalleryGridView.GalleryGridViewListener, MediaPickerDataListener {
@@ -54,7 +54,9 @@ class GalleryMediaChooser extends MediaChooser implements
@Override
public int getSupportedMediaTypes() {
- return MediaPicker.MEDIA_TYPE_IMAGE | MediaPicker.MEDIA_TYPE_VIDEO;
+ return (MediaPicker.MEDIA_TYPE_IMAGE
+ | MediaPicker.MEDIA_TYPE_VIDEO
+ | MediaPicker.MEDIA_TYPE_AUDIO);
}
@Override
diff --git a/tests/src/com/android/messaging/ui/mediapicker/GalleryGridItemViewTest.java b/tests/src/com/android/messaging/ui/mediapicker/GalleryGridItemViewTest.java
index 83d8ac9..304cc74 100644
--- a/tests/src/com/android/messaging/ui/mediapicker/GalleryGridItemViewTest.java
+++ b/tests/src/com/android/messaging/ui/mediapicker/GalleryGridItemViewTest.java
@@ -55,7 +55,7 @@ public class GalleryGridItemViewTest extends ViewTest<GalleryGridItemView> {
final String imageUrl,
final boolean showCheckbox,
final boolean isSelected) {
- final AsyncImageView imageView = (AsyncImageView) view.findViewById(R.id.image);
+ final AsyncImageView imageView = (AsyncImageView) view.findViewById(R.id.thumbnail);
final CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkbox);
assertNotNull(imageView);