1ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/*
2ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Copyright (C) 2016 The Android Open Source Project
3ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
4ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License");
5ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * you may not use this file except in compliance with the License.
6ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * You may obtain a copy of the License at
7ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
8ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *      http://www.apache.org/licenses/LICENSE-2.0
9ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian *
10ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * Unless required by applicable law or agreed to in writing, software
11ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS,
12ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * See the License for the specific language governing permissions and
14ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian * limitations under the License.
15ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian */
16ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
17ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpackage com.android.dialer.callcomposer;
18ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
19ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.content.Context;
20ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.database.Cursor;
21ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.util.AttributeSet;
22ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.view.View;
23ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.FrameLayout;
24ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.ImageView;
25ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport android.widget.ImageView.ScaleType;
26ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.bumptech.glide.Glide;
27ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.bumptech.glide.load.resource.bitmap.DownsampleStrategy;
28ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
29ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport com.bumptech.glide.request.RequestOptions;
30ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianimport java.util.concurrent.TimeUnit;
31ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
32ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian/** Shows an item in the gallery picker grid view. Hosts an FileImageView with a checkbox. */
33ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanianpublic class GalleryGridItemView extends FrameLayout {
34ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
35ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private final GalleryGridItemData data = new GalleryGridItemData();
36ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
37ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private ImageView image;
38ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private View checkbox;
39ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private View gallery;
40ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private String currentFilePath;
41ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private boolean isGallery;
42ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
43ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public GalleryGridItemView(Context context, AttributeSet attrs) {
44ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super(context, attrs);
45ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
46ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
47ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
48ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  protected void onFinishInflate() {
49ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onFinishInflate();
50ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    image = (ImageView) findViewById(R.id.image);
51ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    checkbox = findViewById(R.id.checkbox);
52ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    gallery = findViewById(R.id.gallery);
53ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
54ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    image.setClipToOutline(true);
55ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    checkbox.setClipToOutline(true);
56ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    gallery.setClipToOutline(true);
57ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
58ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
59ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
60ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
61ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    // The grid view auto-fit the columns, so we want to let the height match the width
62ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    // to make the image square.
63ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    super.onMeasure(widthMeasureSpec, widthMeasureSpec);
64ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
65ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
66ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public GalleryGridItemData getData() {
67ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return data;
68ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
69ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
70ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  @Override
71ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void setSelected(boolean selected) {
72ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (selected) {
73ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      checkbox.setVisibility(VISIBLE);
74ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      int paddingPx = getResources().getDimensionPixelSize(R.dimen.gallery_item_selected_padding);
75ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      setPadding(paddingPx, paddingPx, paddingPx, paddingPx);
76ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    } else {
77ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      checkbox.setVisibility(GONE);
78ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      int paddingPx = getResources().getDimensionPixelOffset(R.dimen.gallery_item_padding);
79ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      setPadding(paddingPx, paddingPx, paddingPx, paddingPx);
80ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
81ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
82ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
83ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public boolean isGallery() {
84ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    return isGallery;
85ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
86ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
87ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void showGallery(boolean show) {
88ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    isGallery = show;
89ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    gallery.setVisibility(show ? VISIBLE : INVISIBLE);
90ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
91ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
92ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  public void bind(Cursor cursor) {
93ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    data.bind(cursor);
94ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    showGallery(false);
95ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    updateImageView();
96ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
97ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
98ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  private void updateImageView() {
99ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    image.setScaleType(ScaleType.CENTER_CROP);
100ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
101ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (currentFilePath == null || !currentFilePath.equals(data.getFilePath())) {
102ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      currentFilePath = data.getFilePath();
103ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian
104ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      // Downloads/loads an image from the given URI so that the image's largest dimension is
105ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      // between 1/2 the given dimensions and the given dimensions, with no restrictions on the
106ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      // image's smallest dimension. We skip the memory cache, but glide still applies it's disk
107ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      // cache to optimize loads.
108ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      Glide.with(getContext())
109ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          .load(data.getFileUri())
110ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          .apply(RequestOptions.downsampleOf(DownsampleStrategy.AT_MOST).skipMemoryCache(true))
111ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          .transition(DrawableTransitionOptions.withCrossFade())
112ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          .into(image);
113ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
114ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    long dateModifiedSeconds = data.getDateModifiedSeconds();
115ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    if (dateModifiedSeconds > 0) {
116ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      image.setContentDescription(
117ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          getResources()
118ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian              .getString(
119ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                  R.string.gallery_item_description,
120ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian                  TimeUnit.SECONDS.toMillis(dateModifiedSeconds)));
121ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    } else {
122ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian      image.setContentDescription(
123ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian          getResources().getString(R.string.gallery_item_description_no_date));
124ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian    }
125ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian  }
126ccca31529c07970e89419fb85a9e8153a5396838Eric Erfanian}
127