Home | History | Annotate | Download | only in media
      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      */
     66     public ImageRequestDescriptor() {
     67         this(ImageRequest.UNSPECIFIED_SIZE, ImageRequest.UNSPECIFIED_SIZE,
     68                 ImageRequest.UNSPECIFIED_SIZE, ImageRequest.UNSPECIFIED_SIZE, false, false, 0, 0);
     69     }
     70 
     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 
     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 
     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 
    103     public boolean isStatic() {
    104         return isStatic;
    105     }
    106 
    107     @Override
    108     public abstract MediaRequest<ImageResource> buildSyncMediaRequest(Context context);
    109 
    110     // Called once source dimensions finally determined upon loading the image
    111     public void updateSourceDimensions(final int sourceWidth, final int sourceHeight) {
    112     }
    113 }