content: /**
   * Copyright 2010-present Facebook.
   *
   * 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.facebook.internal;
  
  import android.content.Context;
  import android.net.Uri;
  
  import java.net.URI;
  import java.net.URISyntaxException;
  
  public class ImageRequest {
  
      public interface Callback {
          /**
           * This method should always be called on the UI thread. ImageDownloader makes
           * sure to do this when it is responsible for issuing the ImageResponse
           * @param response
           */
          void onCompleted(ImageResponse response);
      }
  
      public static final int UNSPECIFIED_DIMENSION = 0;
  
      private static final String PROFILEPIC_URL_FORMAT =
              "https://graph.facebook.com/%s/picture";
      private static final String HEIGHT_PARAM = "height";
      private static final String WIDTH_PARAM = "width";
      private static final String MIGRATION_PARAM = "migration_overrides";
      private static final String MIGRATION_VALUE = "{october_2012:true}";
  
      private Context context;
      private URI imageUri;
      private Callback callback;
      private boolean allowCachedRedirects;
      private Object callerTag;
  
      public static URI getProfilePictureUrl(
              String userId,
              int width,
              int height)
              throws URISyntaxException {
  
          Validate.notNullOrEmpty(userId, "userId");
  
          width = Math.max(width, UNSPECIFIED_DIMENSION);
          height = Math.max(height, UNSPECIFIED_DIMENSION);
  
          if (width == UNSPECIFIED_DIMENSION && height == UNSPECIFIED_DIMENSION) {
              throw new IllegalArgumentException("Either width or height must be greater than 0");
          }
  
          Uri.Builder builder = new Uri.Builder().encodedPath(String.format(PROFILEPIC_URL_FORMAT, userId));
  
          if (height != UNSPECIFIED_DIMENSION) {
              builder.appendQueryParameter(HEIGHT_PARAM, String.valueOf(height));
          }
  
          if (width != UNSPECIFIED_DIMENSION) {
              builder.appendQueryParameter(WIDTH_PARAM, String.valueOf(width));
          }
  
          builder.appendQueryParameter(MIGRATION_PARAM, MIGRATION_VALUE);
  
          return new URI(builder.toString());
      }
  
      private ImageRequest(Builder builder) {
          this.context = builder.context;
          this.imageUri = builder.imageUrl;
          this.callback = builder.callback;
          this.allowCachedRedirects = builder.allowCachedRedirects;
          this.callerTag = builder.callerTag == null ? new Object() : builder.callerTag;
      }
  
      public Context getContext() {
          return context;
      }
  
      public URI getImageUri() {
          return imageUri;
      }
  
      public Callback getCallback() {
          return callback;
      }
  
      public boolean isCachedRedirectAllowed() {
          return allowCachedRedirects;
      }
  
      public Object getCallerTag() {
          return callerTag;
      }
  
      public static class Builder {
          // Required
          private Context context;
          private URI imageUrl;
  
          // Optional
          private Callback callback;
          private boolean allowCachedRedirects;
          private Object callerTag;
  
          public Builder(Context context, URI imageUrl) {
              Validate.notNull(imageUrl, "imageUrl");
              this.context = context;
              this.imageUrl = imageUrl;
          }
  
          public Builder setCallback(Callback callback) {
              this.callback = callback;
              return this;
          }
  
          public Builder setCallerTag(Object callerTag) {
              this.callerTag = callerTag;
              return this;
          }
  
          public Builder setAllowCachedRedirects(boolean allowCachedRedirects) {
              this.allowCachedRedirects = allowCachedRedirects;
              return this;
          }
  
          public ImageRequest build() {
              return new ImageRequest(this);
          }
      }
  }
  