/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ 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; import android.view.TouchDelegate; 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; import com.android.messaging.datamodel.data.GalleryGridItemData; import com.android.messaging.ui.AsyncImageView; import com.android.messaging.ui.ConversationDrawables; import com.android.messaging.util.ContentType; import com.google.common.annotations.VisibleForTesting; import java.util.concurrent.TimeUnit; /** * Shows an item in the gallery picker grid view. Hosts an FileImageView with a checkbox. */ public class GalleryGridItemView extends FrameLayout { /** * Implemented by the owner of this GalleryGridItemView instance to communicate on media * picking and selection events. */ public interface HostInterface { void onItemClicked(View view, GalleryGridItemData data, boolean longClick); boolean isItemSelected(GalleryGridItemData data); boolean isMultiSelectEnabled(); } @VisibleForTesting 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 public void onClick(final View v) { mHostInterface.onItemClicked(GalleryGridItemView.this, mData, false /*longClick*/); } }; public GalleryGridItemView(final Context context, final AttributeSet attrs) { super(context, attrs); mData = DataModel.get().createGalleryGridItemData(); } @Override protected void onFinishInflate() { super.onFinishInflate(); 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 public boolean onLongClick(final View v) { mHostInterface.onItemClicked(v, mData, true /* longClick */); return true; } }; setOnLongClickListener(longClickListener); mCheckBox.setOnLongClickListener(longClickListener); addOnLayoutChangeListener(new OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { // Enlarge the clickable region for the checkbox to fill the entire view. final Rect region = new Rect(0, 0, getWidth(), getHeight()); setTouchDelegate(new TouchDelegate(region, mCheckBox) { @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: setPressed(true); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: setPressed(false); break; } return super.onTouchEvent(event); } }); } }); } @Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { // The grid view auto-fit the columns, so we want to let the height match the width // to make the image square. super.onMeasure(widthMeasureSpec, widthMeasureSpec); } public void bind(final Cursor cursor, final HostInterface hostInterface) { final int desiredSize = getResources() .getDimensionPixelSize(R.dimen.gallery_image_cell_size); mData.bind(cursor, desiredSize, desiredSize); mHostInterface = hostInterface; updateViewState(); } private void updateViewState() { updateImageView(); if (mHostInterface.isMultiSelectEnabled() && !mData.isDocumentPickerItem()) { mCheckBox.setVisibility(VISIBLE); mCheckBox.setClickable(true); mCheckBox.setChecked(mHostInterface.isItemSelected(mData)); } else { mCheckBox.setVisibility(GONE); mCheckBox.setClickable(false); } } private void updateImageView() { if (mData.isDocumentPickerItem()) { setBackgroundColor(ConversationDrawables.get().getConversationThemeColor()); mIcon.setImageResource(R.drawable.ic_photo_library_light); mIcon.clearColorFilter(); mImageView.setVisibility(GONE); mIcon.setVisibility(VISIBLE); mFileInfo.setVisibility(GONE); mAdditionalInfo.setVisibility(VISIBLE); } else { final String contentType = mData.getContentType(); if (ContentType.isAudioType(contentType)) { setBackgroundColor( getResources().getColor(R.color.gallery_image_default_background)); mIcon.setImageResource(R.drawable.ic_music); 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); } } } }