1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.messaging.datamodel.media;
17 
18 import android.content.Context;
19 
20 import com.android.messaging.util.Assert;
21 
22 /**
23  * The base ImageRequest descriptor that describes the requirement of the requested image
24  * resource, including the desired size. It holds request info that will be consumed by
25  * ImageRequest instances. Subclasses of ImageRequest are expected to take
26  * more descriptions such as content URI or file path.
27  */
28 public abstract class ImageRequestDescriptor extends MediaRequestDescriptor<ImageResource> {
29     /** Desired size for the image (if known). This is used for bitmap downsampling */
30     public final int desiredWidth;
31     public final int desiredHeight;
32 
33     /** Source size of the image (if known). This is used so that we don't have to manually decode
34      *  the metrics from the image resource */
35     public final int sourceWidth;
36     public final int sourceHeight;
37 
38     /**
39      * A static image resource is required, even if the image format supports animation (like Gif).
40      */
41     public final boolean isStatic;
42 
43     /**
44      * The loaded image will be cropped to circular shape.
45      */
46     public final boolean cropToCircle;
47 
48     /**
49      * The loaded image will be cropped to circular shape with the background color.
50      */
51     public final int circleBackgroundColor;
52 
53     /**
54      * The loaded image will be cropped to circular shape with a stroke color.
55      */
56     public final int circleStrokeColor;
57 
58     protected static final char KEY_PART_DELIMITER = '|';
59 
60     /**
61      * Creates a new image request with unspecified width and height. In this case, the full
62      * bitmap is loaded and decoded, so unless you are sure that the image will be of
63      * reasonable size, you should consider limiting at least one of the two dimensions
64      * (for example, limiting the image width to the width of the ImageView container).
65      */
ImageRequestDescriptor()66     public ImageRequestDescriptor() {
67         this(ImageRequest.UNSPECIFIED_SIZE, ImageRequest.UNSPECIFIED_SIZE,
68                 ImageRequest.UNSPECIFIED_SIZE, ImageRequest.UNSPECIFIED_SIZE, false, false, 0, 0);
69     }
70 
ImageRequestDescriptor(final int desiredWidth, final int desiredHeight)71     public ImageRequestDescriptor(final int desiredWidth, final int desiredHeight) {
72         this(desiredWidth, desiredHeight,
73                 ImageRequest.UNSPECIFIED_SIZE, ImageRequest.UNSPECIFIED_SIZE, false, false, 0, 0);
74     }
75 
ImageRequestDescriptor(final int desiredWidth, final int desiredHeight, final int sourceWidth, final int sourceHeight, final boolean isStatic, final boolean cropToCircle, final int circleBackgroundColor, int circleStrokeColor)76     public ImageRequestDescriptor(final int desiredWidth,
77             final int desiredHeight, final int sourceWidth, final int sourceHeight,
78             final boolean isStatic, final boolean cropToCircle, final int circleBackgroundColor,
79             int circleStrokeColor) {
80         Assert.isTrue(desiredWidth == ImageRequest.UNSPECIFIED_SIZE || desiredWidth > 0);
81         Assert.isTrue(desiredHeight == ImageRequest.UNSPECIFIED_SIZE || desiredHeight > 0);
82         Assert.isTrue(sourceWidth == ImageRequest.UNSPECIFIED_SIZE || sourceWidth > 0);
83         Assert.isTrue(sourceHeight == ImageRequest.UNSPECIFIED_SIZE || sourceHeight > 0);
84         this.desiredWidth = desiredWidth;
85         this.desiredHeight = desiredHeight;
86         this.sourceWidth = sourceWidth;
87         this.sourceHeight = sourceHeight;
88         this.isStatic = isStatic;
89         this.cropToCircle = cropToCircle;
90         this.circleBackgroundColor = circleBackgroundColor;
91         this.circleStrokeColor = circleStrokeColor;
92     }
93 
getKey()94     public String getKey() {
95         return new StringBuilder()
96                 .append(desiredWidth).append(KEY_PART_DELIMITER)
97                 .append(desiredHeight).append(KEY_PART_DELIMITER)
98                 .append(String.valueOf(cropToCircle)).append(KEY_PART_DELIMITER)
99                 .append(String.valueOf(circleBackgroundColor)).append(KEY_PART_DELIMITER)
100                 .append(String.valueOf(isStatic)).toString();
101     }
102 
isStatic()103     public boolean isStatic() {
104         return isStatic;
105     }
106 
107     @Override
buildSyncMediaRequest(Context context)108     public abstract MediaRequest<ImageResource> buildSyncMediaRequest(Context context);
109 
110     // Called once source dimensions finally determined upon loading the image
updateSourceDimensions(final int sourceWidth, final int sourceHeight)111     public void updateSourceDimensions(final int sourceWidth, final int sourceHeight) {
112     }
113 }