| /* |
| * 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.attachmentchooser; |
| |
| import android.content.Context; |
| import android.graphics.Rect; |
| import android.util.AttributeSet; |
| import android.view.LayoutInflater; |
| import android.view.TouchDelegate; |
| import android.view.View; |
| import android.widget.CheckBox; |
| import android.widget.FrameLayout; |
| |
| import com.android.messaging.R; |
| import com.android.messaging.datamodel.data.MessagePartData; |
| import com.android.messaging.ui.AttachmentPreviewFactory; |
| import com.android.messaging.util.Assert; |
| import com.google.common.annotations.VisibleForTesting; |
| |
| /** |
| * Shows an item in the attachment picker grid. |
| */ |
| public class AttachmentGridItemView extends FrameLayout { |
| public interface HostInterface { |
| boolean isItemSelected(MessagePartData attachment); |
| void onItemCheckedChanged(AttachmentGridItemView view, MessagePartData attachment); |
| void onItemClicked(AttachmentGridItemView view, MessagePartData attachment); |
| } |
| |
| @VisibleForTesting |
| MessagePartData mAttachmentData; |
| private FrameLayout mAttachmentViewContainer; |
| private CheckBox mCheckBox; |
| private HostInterface mHostInterface; |
| |
| public AttachmentGridItemView(final Context context, final AttributeSet attrs) { |
| super(context, attrs); |
| } |
| |
| @Override |
| protected void onFinishInflate() { |
| super.onFinishInflate(); |
| mAttachmentViewContainer = (FrameLayout) findViewById(R.id.attachment_container); |
| mCheckBox = (CheckBox) findViewById(R.id.checkbox); |
| mCheckBox.setOnClickListener(new OnClickListener() { |
| @Override |
| public void onClick(final View v) { |
| mHostInterface.onItemCheckedChanged(AttachmentGridItemView.this, mAttachmentData); |
| } |
| }); |
| setOnClickListener(new OnClickListener() { |
| @Override |
| public void onClick(final View v) { |
| mHostInterface.onItemClicked(AttachmentGridItemView.this, mAttachmentData); |
| } |
| }); |
| 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. |
| final int touchAreaIncrease = getResources().getDimensionPixelOffset( |
| R.dimen.attachment_grid_checkbox_area_increase); |
| final Rect region = new Rect(); |
| mCheckBox.getHitRect(region); |
| region.inset(-touchAreaIncrease, -touchAreaIncrease); |
| setTouchDelegate(new TouchDelegate(region, mCheckBox)); |
| } |
| }); |
| } |
| |
| @Override |
| protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { |
| // The grid view auto-fits the columns, so we want to let the height match the width |
| // to make the attachment preview square. |
| super.onMeasure(widthMeasureSpec, widthMeasureSpec); |
| } |
| |
| public void bind(final MessagePartData attachment, final HostInterface hostInterface) { |
| Assert.isTrue(attachment.isAttachment()); |
| mHostInterface = hostInterface; |
| updateSelectedState(); |
| if (mAttachmentData == null || !mAttachmentData.equals(attachment)) { |
| mAttachmentData = attachment; |
| updateAttachmentView(); |
| } |
| } |
| |
| @VisibleForTesting |
| HostInterface testGetHostInterface() { |
| return mHostInterface; |
| } |
| |
| public void updateSelectedState() { |
| mCheckBox.setChecked(mHostInterface.isItemSelected(mAttachmentData)); |
| } |
| |
| private void updateAttachmentView() { |
| mAttachmentViewContainer.removeAllViews(); |
| final LayoutInflater inflater = LayoutInflater.from(getContext()); |
| final View attachmentView = AttachmentPreviewFactory.createAttachmentPreview(inflater, |
| mAttachmentData, mAttachmentViewContainer, |
| AttachmentPreviewFactory.TYPE_CHOOSER_GRID, true /* startImageRequest */, null); |
| mAttachmentViewContainer.addView(attachmentView); |
| } |
| } |