/* * Copyright (C) 2016 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.dialer.callcomposer; import android.content.Context; import android.database.Cursor; import android.util.AttributeSet; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.bitmap.DownsampleStrategy; import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; import com.bumptech.glide.request.RequestOptions; 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 { private final GalleryGridItemData data = new GalleryGridItemData(); private ImageView image; private View checkbox; private View gallery; private String currentFilePath; private boolean isGallery; public GalleryGridItemView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onFinishInflate() { super.onFinishInflate(); image = (ImageView) findViewById(R.id.image); checkbox = findViewById(R.id.checkbox); gallery = findViewById(R.id.gallery); image.setClipToOutline(true); checkbox.setClipToOutline(true); gallery.setClipToOutline(true); } @Override protected void onMeasure(int widthMeasureSpec, 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 GalleryGridItemData getData() { return data; } @Override public void setSelected(boolean selected) { if (selected) { checkbox.setVisibility(VISIBLE); int paddingPx = getResources().getDimensionPixelSize(R.dimen.gallery_item_selected_padding); setPadding(paddingPx, paddingPx, paddingPx, paddingPx); } else { checkbox.setVisibility(GONE); int paddingPx = getResources().getDimensionPixelOffset(R.dimen.gallery_item_padding); setPadding(paddingPx, paddingPx, paddingPx, paddingPx); } } public boolean isGallery() { return isGallery; } public void showGallery(boolean show) { isGallery = show; gallery.setVisibility(show ? VISIBLE : INVISIBLE); } public void bind(Cursor cursor) { data.bind(cursor); showGallery(false); updateImageView(); } private void updateImageView() { image.setScaleType(ScaleType.CENTER_CROP); if (currentFilePath == null || !currentFilePath.equals(data.getFilePath())) { currentFilePath = data.getFilePath(); // Downloads/loads an image from the given URI so that the image's largest dimension is // between 1/2 the given dimensions and the given dimensions, with no restrictions on the // image's smallest dimension. We skip the memory cache, but glide still applies it's disk // cache to optimize loads. Glide.with(getContext()) .load(data.getFileUri()) .apply(RequestOptions.downsampleOf(DownsampleStrategy.AT_MOST).skipMemoryCache(true)) .transition(DrawableTransitionOptions.withCrossFade()) .into(image); } long dateModifiedSeconds = data.getDateModifiedSeconds(); if (dateModifiedSeconds > 0) { image.setContentDescription( getResources() .getString( R.string.gallery_item_description, TimeUnit.SECONDS.toMillis(dateModifiedSeconds))); } else { image.setContentDescription( getResources().getString(R.string.gallery_item_description_no_date)); } } }