summaryrefslogtreecommitdiff
path: root/java/com/android/dialer/callcomposer/GalleryGridItemView.java
blob: d70fd57c1025a287c61532db26264823c0b07714 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
 * 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));
    }
  }
}